Deduce模板参数,用于初始化列表

时间:2016-10-25 13:30:51

标签: c++ c++14 initializer-list template-deduction

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

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明确地

非常感谢提前

2 个答案:

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