C++ 实验性make_数组,我可以使用brace init list作为参数吗?
我尝试实现一个版本的make_array,该版本不完全相同,但非常类似于: 我发现这个代码似乎不起作用,我说的对吗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是一个可变模板函数,它接受任何类型的参数。然后,它将对这些参数执行隐式转换,以获得数组的基类型。因此,除非指定每个参数的类型,否则编译器必须使
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)...}};
}