考虑以下代码:
template<size_t head,size_t ... Dims> struct make_vec {
typedef typename make_vec<Dims...>::type type[head];
};
template<size_t head> struct make_vec<head> {typedef float type[head];};
template<size_t ... Dims>
struct vec {
typename make_vec<Dims...>::type _data;
};
由于该类vec
是一个聚合类,因此我可以使用大括号封闭初始化器列表来初始化vec
.
vec<3,3> foo = {{
{1,2,3},
{4,5,6},
{7,8,9}
}};
如果我向我的 vec 类添加一个构造函数(例如,允许使用表达式模板,这是我的最终目标),则不再允许此语法,因为vec
不再是聚合。
在这种情况下,逻辑上要做的事情是使用std::initializer_list
; 但是,当我编译使用此构造的代码时,即使启用了优化,我也会得到一个很长的汇编代码(我曾经std::uninitialized_copy
从 initializer_list 复制到我的 vec 类数据成员)。
我没有运气使用可变参数模板来获得相同的结果。初始化用户定义的固定大小多数组类型的最佳方式是什么(即良好的运行时性能和清晰的语法)?