使用初始化列表将模板大小的数组传递给函数

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});