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

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 传递给函数 foo —— 为了方便起见,我将使用 std::initializer_list 表示法。 我尝试使用 std::array 来聚合 ints(如上面的代码所示),但是,编译器无法推断数组大小,因为 ints 作为std::initializer_list.

使用 std::initializer_list 而不是 std::array 也不能解决问题,因为(与 std::array 相反)std::initializer_list 的大小未被捕获为模板参数。

有谁知道可以使用哪种数据结构,以便可以使用 std::initializer_list 符号传递 int,而不传递 [=12] 的模板参数 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 的回答。