C++11 如何将可变模板参数分配给std::array

C++11 如何将可变模板参数分配给std::array,c++11,variadic-templates,C++11,Variadic Templates,我有一个std::array,还有一个可变模板函数,其参数数量与数组大小匹配。我需要将参数分配给数组的元素。换句话说,在下面的代码中,我希望a获得值{1,2,3}和b获得值{1,2,3,4,5} std::array<int, 3> a; std::array<int, 5> b; assign_values(a, 1, 2, 3); assign_values(b, 1, 2, 3, 4, 5); std::数组a; std::数组b; 分配_值(a、1、2、3);

我有一个
std::array
,还有一个可变模板函数,其参数数量与数组大小匹配。我需要将参数分配给数组的元素。换句话说,在下面的代码中,我希望
a
获得值
{1,2,3}
b
获得值
{1,2,3,4,5}

std::array<int, 3> a;
std::array<int, 5> b;

assign_values(a, 1, 2, 3);
assign_values(b, 1, 2, 3, 4, 5);
std::数组a;
std::数组b;
分配_值(a、1、2、3);
分配_值(b、1、2、3、4、5);
问题是如何实现
赋值
可变模板函数

我受C++14版本的限制

更新: 参数可以是不同的类型:
assign_值(b,1,2u,3.,'4',5l)

像这样的东西:

template<class T, size_t N, class ... Values>
void assign_values(std::array<T,N>& arr, Values... vals) {
    static_assert(N == sizeof...(vals));
    int j = 0;
    for (auto i : std::initializer_list< std::common_type_t<Values...> >{vals...})
        arr[j++] = i;
}
模板
无效赋值(标准::数组和arr,值…VAL){
静态断言(N==sizeof…(vals));
int j=0;
用于(自动i:std::初始值设定项\u列表{vals…})
arr[j++]=i;
}
像这样的事情:

template<class T, size_t N, class ... Values>
void assign_values(std::array<T,N>& arr, Values... vals) {
    static_assert(N == sizeof...(vals));
    int j = 0;
    for (auto i : std::initializer_list< std::common_type_t<Values...> >{vals...})
        arr[j++] = i;
}
模板
无效赋值(标准::数组和arr,值…VAL){
静态断言(N==sizeof…(vals));
int j=0;
用于(自动i:std::初始值设定项\u列表{vals…})
arr[j++]=i;
}

我受C++14版本的限制

未使用的数组初始化(C++17之前的模板折叠代理)的老把戏应该是有效的(也是C++11)

模板
无效赋值(标准::数组和arr,值…VAL)
{
静态断言(N==sizeof…(vals));
使用unused=int[];
int j=0;
(void)未使用的{0,(arr[j++]=vals,0)…};
}
我受C++14版本的限制

未使用的数组初始化(C++17之前的模板折叠代理)的老把戏应该是有效的(也是C++11)

模板
无效赋值(标准::数组和arr,值…VAL)
{
静态断言(N==sizeof…(vals));
使用unused=int[];
int j=0;
(void)未使用的{0,(arr[j++]=vals,0)…};
}

甚至“void assign_values(std::array&arr,values…vals){arr={vals…};}@Kit。是的,而且你的解决方案更好更简单:)@rafix07这个解决方案不是通用的。您提供泛型类型
但只迭代整数:
for(int i:{vals…})
@rafix07还有一个复杂问题:在代码段中,所有
都是整数(至少它们是相同类型的)。如果我们使用不同的类型(即使是那些没有降低精度的类型)会怎么样<代码>分配_值(b,1,2u,3.,'4')@DmitryKuzminov初始值设定项列表必须具有一种类型的所有值。因此,您可以使用
common\u type\t
来推断它。然后,您可以在输入参数包中混合使用浮点、整数、字符,甚至“void assign_values(std::array&arr,values…vals){arr={vals…};}@Kit”。是的,而且你的解决方案更好更简单:)@rafix07这个解决方案不是通用的。您提供泛型类型
但只迭代整数:
for(int i:{vals…})
@rafix07还有一个复杂问题:在代码段中,所有
都是整数(至少它们是相同类型的)。如果我们使用不同的类型(即使是那些没有降低精度的类型)会怎么样<代码>分配_值(b,1,2u,3.,'4')@DmitryKuzminov初始值设定项列表必须具有一种类型的所有值。因此,您可以使用
common\u type\t
来推断它。然后你可以在输入参数包中混合浮点、整数和字符。我很困惑:如果你能使用C++14,为什么这个标签是C++11?@Chipster这只是意味着我可以使用C++11,但不能使用C++17。在我的问题中没有什么是针对C++14的。明白了。我的事情是,因为大多数C++版本都是向后兼容的,最好把最新的版本作为标签使用吗?那只是我的思考过程。当然,你不必这样标记它。我很困惑:如果你可以使用C++14,为什么这个标记是C++11?@Chipster这只是意味着我可以使用C++11,但不能使用C++17。在我的问题中没有什么是针对C++14的。明白了。我的事情是,因为大多数C++版本都是向后兼容的,最好把最新的版本作为标签使用吗?那只是我的思考过程。不过,您当然不必这样标记它。