推导初始化列表大小的模板参数

Deduce template argument for size of initializer list

本文关键字:参数 初始化 列表      更新时间:2023-10-16

我有以下(不可编译的)代码:

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的答案。