我有以下(不可编译)代码:
template< size_t N >
void foo( std::array<int, N> )
{
// Code, where "N" is used.
}
int main()
{
foo( { 1,2 } );
}
在这里,我想将任意数量的int
s传递给函数foo
- 为方便起见,我将使用std::initializer_list
表示法。
我尝试使用std::array
来聚合int
s(如上面的代码所示),但是,编译器无法推断出数组大小,因为int
被传递为std::initializer_list
。
使用std::initializer_list
代替std::array
也无法解决问题,因为(与std::array
相反)std::initializer_list
的大小未被捕获为模板参数
是否有人知道可以使用哪种数据结构,以便int
可以使用std::initializer_list
表示法传递,而不传递N
的模板参数foo
明确地
非常感谢提前
答案 0 :(得分:6)
感谢core issue 1591,您可以使用
template <std::size_t N>
void foo( int const (&arr)[N] )
{
// Code, where "N" is used.
}
foo({1, 2, 3});
答案 1 :(得分:1)
如果不必使用初始化程序列表,则可以使用可变参数模板参数包:
template<size_t S>
void foo_impl(array<int, S> const&)
{
cout << __PRETTY_FUNCTION__ << endl;
}
template<typename... Vals>
auto foo(Vals&&... vals) {
foo_impl<sizeof...(vals)>({ std::forward<Vals>(vals)... });
}
您可以按如下方式调用它:
foo(1,2,3,4,5);
这将常见的类型检查推迟到std::array
的初始化点(除非你添加一些公认的丑陋断言),所以你可能应该更喜欢Columbo的答案。