Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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++ 实验性make_数组,我可以使用brace init list作为参数吗?_C++_Arrays_Variadic Templates_C++17 - Fatal编程技术网

C++ 实验性make_数组,我可以使用brace init list作为参数吗?

C++ 实验性make_数组,我可以使用brace init list作为参数吗?,c++,arrays,variadic-templates,c++17,C++,Arrays,Variadic Templates,C++17,我尝试实现一个版本的make_array,该版本不完全相同,但非常类似于: 我发现这个代码似乎不起作用,我说的对吗 using MyType = std::pair<int, float>; constexpr auto the_array = make_array<MyType>({1, 7.5f}); make_array是一个可变模板函数,它接受任何类型的参数。然后,它将对这些参数执行隐式转换,以获得数组的基类型。因此,除非指定每个参数的类型,否则编译器必须使

我尝试实现一个版本的make_array,该版本不完全相同,但非常类似于:

我发现这个代码似乎不起作用,我说的对吗

using MyType = std::pair<int, float>;

constexpr auto the_array = make_array<MyType>({1, 7.5f});

make_array
是一个可变模板函数,它接受任何类型的参数。然后,它将对这些参数执行隐式转换,以获得数组的基类型。因此,除非指定每个参数的类型,否则编译器必须使用模板参数推断


大括号的init列表无法推导(在
auto
变量之外)。因此,在构造每个成员时,必须明确提到类型名称。

make_array是一个可变模板函数,它接受任何类型的参数。然后,它将对这些参数执行隐式转换,以获得数组的基类型。因此,除非指定每个参数的类型,否则编译器必须使用模板参数推断



大括号的init列表无法推导(在
auto
变量之外)。因此,在构造每个成员时,您必须显式地提到类型名称。

您是遇到编译器错误还是运行时错误?编译时,但我认为我找到了解决方案,(可能),在make_数组中,我只返回一个{{std::forward(args)..}而不是{{std::forward(args)..}。那行吗?我不知道。CPPPreference可能的实现中没有
Val
模板参数。请向我们展示您的
make_array
?@SimonKraemer给您。上面编辑过。您是否遇到编译器或运行时错误?编译时,但我认为我找到了解决方案,(可能),在make_数组中,我只返回一个{{std::forward(args)..}}而不是{{std::forward(args)..}}。那行吗?我不知道。CPPPreference可能的实现中没有
Val
模板参数。请向我们展示您的
make_array
?@SimonKraemer给您。以上编辑。@GermánDiago:否。因为这样会将其变成一个
初始值设定项\u列表
。而且
make_array
不会从
initializer_list
s创建数组。实际上,我的意思是:我可以试试模板makeArray(std::initilizer_list)之类的东西,并将其用作makeArray({{5,7.5},…}),我只是想去掉数组中所有元素的显式MyType。@GermánDiago:我知道你的意思,但还是不行。在
std::array
的模板参数列表中,不能使用
初始值设定项列表的大小。无论如何都不是通过函数。@GermanánDiago为了解决这个问题,您可以创建一个类型
Ctors
,它合成了接受
N
N-1
N-2
,…,
0
类型
T
参数的构造函数(对于某些固定上限,比如10)并使
make_数组
具有
Ctors
参数。然后
make\u arrray({a,b})
应该工作并创建
array
对象。@GermanánDiago:No。因为这样会将它变成
初始值设定项\u列表
。而且
make_array
不会从
initializer_list
s创建数组。实际上,我的意思是:我可以试试模板makeArray(std::initilizer_list)之类的东西,并将其用作makeArray({{5,7.5},…}),我只是想去掉数组中所有元素的显式MyType。@GermánDiago:我知道你的意思,但还是不行。在
std::array
的模板参数列表中,不能使用
初始值设定项列表的大小。无论如何都不是通过函数。@GermanánDiago为了解决这个问题,您可以创建一个类型
Ctors
,它合成了接受
N
N-1
N-2
,…,
0
类型
T
参数的构造函数(对于某些固定上限,比如10)并使
make_数组
具有
Ctors
参数。然后
make_arrray({a,b})
应该工作并创建
array
对象。
template <class Val = void, class... Args,
      class = std::enable_if_t<std::is_void<Val>{}, int>>
constexpr std::array<
std::tuple_element_t
<0,
 std::tuple<Args...>>,
sizeof...(Args)> makeArray(Args &&... args) {
    return {{std::forward<Args>(args)...}};
}

template <class Val = void, class... Args,
      class = std::enable_if_t<!std::is_void<Val>{}, int>>
constexpr std::array<
    Val,
    sizeof...(Args)> makeArray(Args &&... args) {
    return {{std::forward<Val>(args)...}};
}