使用初始化列表将模板大小的数组传递给函数
Pass array of template size to function using an initializer list
我有一个模板函数,它接受一个任意大小的 std::array
作为参数。它看起来大致是这样的:
template <size_t n>
void foo(const std::array<int, n>& numbers) {
for (const auto & number: numbers) {
// ... do stuff ...
}
}
我可以称它为像这样:
std::array<int, 2> ints = {4, 5};
foo(ints);
一切都很好。
不幸的是,我无法使用初始化列表直接调用该函数。此代码:
foo({4, 5});
给我以下错误:
错误:没有匹配的成员函数来调用 'foo'
注意:候选模板被忽略:无法推断模板参数 'n'
有没有办法使用初始化列表或类似的东西使我的函数工作?
{/*..*/}
没有类型,因此不能在模板函数中推导,除了 std::initializer_list<T>
和 C 数组 T (&a)[N]
.
所以你必须
添加重载以处理 std::initializer_list<int>
或 C 数组。
// span (C++20) has constructor from std::array :)
void foo(const std::span<int>& numbers) {
for (const auto & number: numbers) {
// ... do stuff ...
}
}
void foo(std::initializer_list<int> numbers) {
foo(std::span{numbers.begin(), numbers.size()});
}
或提供非推导模板参数:foo<2>({4, 5});
或向{}
提供类型(使用 C++17 的 CTAD 更容易):foo(std::array{4, 5});
我有一个模板函数,它接受一个任意大小的 std::array
作为参数。它看起来大致是这样的:
template <size_t n>
void foo(const std::array<int, n>& numbers) {
for (const auto & number: numbers) {
// ... do stuff ...
}
}
我可以称它为像这样:
std::array<int, 2> ints = {4, 5};
foo(ints);
一切都很好。
不幸的是,我无法使用初始化列表直接调用该函数。此代码:
foo({4, 5});
给我以下错误:
错误:没有匹配的成员函数来调用 'foo' 注意:候选模板被忽略:无法推断模板参数 'n'
有没有办法使用初始化列表或类似的东西使我的函数工作?
{/*..*/}
没有类型,因此不能在模板函数中推导,除了 std::initializer_list<T>
和 C 数组 T (&a)[N]
.
所以你必须
添加重载以处理
std::initializer_list<int>
或 C 数组。// span (C++20) has constructor from std::array :) void foo(const std::span<int>& numbers) { for (const auto & number: numbers) { // ... do stuff ... } } void foo(std::initializer_list<int> numbers) { foo(std::span{numbers.begin(), numbers.size()}); }
或提供非推导模板参数:
foo<2>({4, 5});
或向
{}
提供类型(使用 C++17 的 CTAD 更容易):foo(std::array{4, 5});