2

考虑以下代码:

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

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

4

1 回答 1

3

您可以编写一个构造函数

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

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

但是,我不知道生成的代码。

于 2012-04-09T20:48:16.840 回答