gpt4 book ai didi

c++ - 使用初始值设定项列表将模板大小的数组传递给函数

转载 作者:行者123 更新时间:2023-12-03 11:47:46 24 4
gpt4 key购买 nike

我有一个模板化函数,它接受任意大小的 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});

给我以下错误:

error: no matching member function for call to 'foo'note: candidate template ignored: couldn't infer template argument '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});

关于c++ - 使用初始值设定项列表将模板大小的数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61390566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com