C++ 我们不能从初始值设定项列表创建std::数组,但是我们可以使用带有可变参数的辅助函数来创建它吗? 请考虑以下向量< /代码>类: template<typename T, class Tuple = std::vector<T>> class vector { public: using size_type = typename Tuple::size_type; template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, size_type>::value>> vector(size_type n) : m_elements(n) { } template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, std::initializer_list<T>>::value>> vector(std::initializer_list<T> init) : m_elements(init) { } private: Tuple m_elements; }; // class vector template<typename T, std::size_t N> using static_vector = vector<T, std::array<T, N>>; template<typename T> static_vector<T, /* N */> make_static_vector(T... elements) { /* ... */ } 模板 类向量 { 公众: 使用size\u type=typename元组::size\u type; 模板 向量(大小\类型n) :m_元素(n) { } 模板 向量(std::初始值设定项\列表初始值) :m_元素(初始) { } 私人: 元组m_元素; }; // 类向量 模板 使用静态_向量=向量; 模板 静态向量使静态向量(T…元素){/*…*/}
问题是我想对C++ 我们不能从初始值设定项列表创建std::数组,但是我们可以使用带有可变参数的辅助函数来创建它吗? 请考虑以下向量< /代码>类: template<typename T, class Tuple = std::vector<T>> class vector { public: using size_type = typename Tuple::size_type; template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, size_type>::value>> vector(size_type n) : m_elements(n) { } template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, std::initializer_list<T>>::value>> vector(std::initializer_list<T> init) : m_elements(init) { } private: Tuple m_elements; }; // class vector template<typename T, std::size_t N> using static_vector = vector<T, std::array<T, N>>; template<typename T> static_vector<T, /* N */> make_static_vector(T... elements) { /* ... */ } 模板 类向量 { 公众: 使用size\u type=typename元组::size\u type; 模板 向量(大小\类型n) :m_元素(n) { } 模板 向量(std::初始值设定项\列表初始值) :m_元素(初始) { } 私人: 元组m_元素; }; // 类向量 模板 使用静态_向量=向量; 模板 静态向量使静态向量(T…元素){/*…*/},c++,templates,c++14,C++,Templates,C++14,问题是我想对元组使用std::array,但是std::array不能从初始值列表构建。这就是为什么我在这种情况下禁用了vector的相应构造函数。(我知道我可以使用std::copy(init.begin()、init.end()、m_elements.begin(),但这会产生其他问题。) 因为我想做一些类似于static\u vector x={1,2,3};的事情,所以我认为我最好的选择(请随意纠正我)是提供一个像make\u static\u vector这样的帮助函数(这不如初始值设
元组使用std::array
,但是std::array
不能从初始值列表构建。这就是为什么我在这种情况下禁用了vector
的相应构造函数。(我知道我可以使用std::copy(init.begin()、init.end()、m_elements.begin()
,但这会产生其他问题。)
因为我想做一些类似于static\u vector x={1,2,3};
的事情,所以我认为我最好的选择(请随意纠正我)是提供一个像make\u static\u vector
这样的帮助函数(这不如初始值设定项\u list
漂亮,所以,再次请随意想出一个更漂亮的解决方案。)
我想写auto x=make_static_vector(1,2,3);
。我需要如何实现它?一个简单的表单如下所示:
template <typename T,typename... Elements>
static_vector<T, sizeof...(Elements)>
make_static_vector(Elements... elements)
{
return static_vector<T,sizeof...(Elements)>(elements...);
}
模板
静态矢量
生成静态向量(元素…元素)
{
返回静态_向量(元素…);
}
您还需要为向量创建一个可变构造函数:
template <typename... Args>
vector(Args... init)
: m_elements{static_cast<T>(init)...}
{ }
模板
向量(Args…init)
:m_元素{static_cast(init)…}
{ }
如果要避免在需要双精度的情况下使用INT缩小错误范围,则必须使用静态\u cast
如果你想使用完美的转发,输入起来会有点困难,但想法是一样的。一个简单的表单如下所示:
template <typename T,typename... Elements>
static_vector<T, sizeof...(Elements)>
make_static_vector(Elements... elements)
{
return static_vector<T,sizeof...(Elements)>(elements...);
}
模板
静态矢量
生成静态向量(元素…元素)
{
返回静态_向量(元素…);
}
您还需要为向量创建一个可变构造函数:
template <typename... Args>
vector(Args... init)
: m_elements{static_cast<T>(init)...}
{ }
模板
向量(Args…init)
:m_元素{static_cast(init)…}
{ }
如果要避免在需要双精度的情况下使用INT缩小错误范围,则必须使用静态\u cast
如果你想使用完美的转发,输入起来会有点困难,但想法是一样的。这确实是有效的:std::array a2={1,2,3};
。这个也一样(在C++11中,使用C++14你不需要双大括号):std::array a1{{1,2,3}
。请参阅。@skypjack这是一个带括号的初始化列表,OP谈论的是std::initializer\u list
您是对的,我只是想看看并找出目标。仅此而已。:-)这确实有效:std::array a2={1,2,3}代码>。这一个也是(在C++11中,使用C++14不需要双大括号):std::array a1{{{1,2,3}代码>。请看。@skypjack这是一个带括号的初始化列表,OP谈论的是std::initializer\u list
您是对的,我只是想看一下并找出目标。就这些。:-)为什么我应该或者可能想使用完美转发来代替?@0xbadf00d:如果你正在制作一个大对象的向量,它可以有效地移动,但不能有效地复制,那么使用完美转发可能会提供更好的性能。我到底需要更改什么?我猜make_static_vector(Elements&&…Elements){return static_vector(std::forward(Elements);}
。还有什么吗?@0xbadf00d所有的构造函数都是sfinae友好的,那么也许@0xbadf00d:我也在谈论第二个。这是同样的问题。如果你通过double
s而不是int,它会起作用:为什么我应该或者可能想使用完美转发来代替?@0xbadf00d:如果你正在生成一个可以有效移动但不能有效复制的大型对象向量,那么使用完美转发可能会提供更好的性能。我到底需要更改什么?我猜make_static_vector(Elements&&…Elements){return static_vector(std::forward(Elements);}
。还有什么吗?@0xbadf00d所有的构造函数都是sfinae友好的,那么也许@0xbadf00d:我也在谈论第二个。这是同样的问题。如果您传递的是double
s而不是int,则它可以工作: