gpt4 book ai didi

c++ - 关于非聚合结构的初始化

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:10 24 4
gpt4 key购买 nike

考虑以下代码:

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

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

最佳答案

你可以写一个构造函数

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

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

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

关于c++ - 关于非聚合结构的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10079382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com