关于非聚合结构的初始化

时间:2012-04-09 20:26:12

标签: c++ c++11

请考虑以下代码:

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类数据成员。)

我没有运气使用可变参数模板来获得相同的结果。 初始化用户定义的固定大小多数组类型的最佳方法(即良好的运行时性能和清晰的语法)是什么?

1 个答案:

答案 0 :(得分:3)

你可以编写一个构造函数

typename make_vec<Dims...>::type const&

这将允许用户代码使用相同的初始化样式,就好像它是一个聚合。如果您正在使用GCC,则可能需要最新版本,例如GCC 4.7。

但我不知道生成的代码。