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

Jos*_*ler 2 c++ templates initializer-list

我有一个模板化函数,它以std::array任意大小作为参数。它看起来大致是这样的:

template <size_t n>
void foo(const std::array<int, n>& numbers) {
    for (const auto & number: numbers) {
        // ... do stuff ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以这样称呼它:

std::array<int, 2> ints = {4, 5};
foo(ints);
Run Code Online (Sandbox Code Playgroud)

一切都很好。

不幸的是,我无法使用初始化列表直接调用该函数。这段代码:

foo({4, 5});
Run Code Online (Sandbox Code Playgroud)

给了我以下错误:

错误:没有匹配的成员函数来调用“foo”
注意:候选模板被忽略:无法推断模板参数“n”

有没有办法使用初始化列表或类似的东西使我的函数工作?

Jar*_*d42 5

{/*..*/}没有类型,因此除了std::initializer_list<T>C-arrays之外,不能在模板函数中推导出来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()});
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 或提供非推导模板参数: foo<2>({4, 5});

  • 或提供类型{}(使用 C++17 的 CTAD 更容易):foo(std::array{4, 5});