2012-04-09 59 views
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类数据成员中)。

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

+0

我忘了,但另一种可能性是使您的表达式模板的类型具有隐式转换运算符。那时不需要构造函数。 – 2012-04-10 10:04:47

回答

3

你可以写一个构造采取

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

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

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

+0

这似乎工作。我使用std :: memcpy来初始化_data成员,并且GCC 4.7能够优化它。 – sbabbi 2012-04-10 12:43:07