推导初始化列表大小的模板参数
Deduce template argument for size of initializer list
我有以下(不可编译的)代码:
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
s是作为std::initializer_list
传递的。
使用std::initializer_list
代替std::array
也不能解决问题,因为(与std::array
相比)std::initializer_list
的大小没有被捕获为模板参数。
有谁知道可以使用哪种数据结构,以便int
s可以通过使用std::initializer_list
表示法传递,而无需显式传递foo
的模板参数N
?
提前致谢
由于core issue 1591,您可以使用
template <std::size_t N>
void foo( int const (&arr)[N] )
{
// Code, where "N" is used.
}
foo({1, 2, 3});
如果不是必须使用初始化列表,可以使用可变的模板参数包:
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的答案。
相关文章:
- C++转换参数初始化问题
- 在构造函数中使用可变参数初始化 std::tuple
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 如何通过参数初始化构造函数中的数组?
- 在模板类中使用"this"会导致参数初始化错误
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用模板参数初始化静态 const 成员
- 基于模板参数初始化静态字符
- 使用参数初始化
- 使用参数包参数初始化"std::array"
- 从按值构造函数参数初始化的引用成员
- 使用派生的[C++]生成的参数初始化基类
- 一个C++默认参数可以用另一个参数初始化吗
- 如何用功能指针作为参数初始化静态成员的模板
- 用参数初始化另一类构造函数中的对象
- C :如何通过其构造函数的参数初始化类内部矩阵的尺寸
- C++:基于构造函数参数初始化向量
- 正在使用模板参数初始化stl类
- 如果类 A 修改其构造参数,我可以使用常量参数初始化 const A 吗?
- 使用结构非类型可变参数模板参数初始化结构的字符串数据成员