Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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,则它可以工作: