请考虑以下代码:
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类数据成员。)
我没有运气使用可变参数模板来获得相同的结果。 初始化用户定义的固定大小多数组类型的最佳方法(即良好的运行时性能和清晰的语法)是什么?
答案 0 :(得分:3)
你可以编写一个构造函数
typename make_vec<Dims...>::type const&
这将允许用户代码使用相同的初始化样式,就好像它是一个聚合。如果您正在使用GCC,则可能需要最新版本,例如GCC 4.7。
但我不知道生成的代码。