推导初始化列表大小的模板参数
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
来聚合 int
s(如上面的代码所示),但是,编译器无法推断数组大小,因为 int
s 作为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 的回答。
我有以下(不可编译)代码:
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
来聚合 int
s(如上面的代码所示),但是,编译器无法推断数组大小,因为 int
s 作为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 的回答。