gpt4 book ai didi

c++ - 如何让 for_each 使用模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:27 24 4
gpt4 key购买 nike

我是 c++ 的新手,正在尝试了解 for_each 的工作原理。所以我想看看它是如何与模板一起工作的,并尝试了这段代码,但它给出了一个错误

当我尝试在 main 中使用 for each 时,它正常工作

template <class T>
void forEachTest(T a[])
{
for (int x : a)
cout << x << endl;
}
int main()
{
int a[5] = { 10, 50, 30, 40, 20 };
forEachTest(a);
return 0;
}

最佳答案

I am new to c++ and am trying to understand how for_each works

如果您指的是 range-based for-loop 作为 for_each 这里,它只是 iterator based loop 的语法糖,适用于定义了 beginend 成员函数的任何对象。

auto&& __range = range_expression;                     // (until C++17)
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
{
range_declaration = *__begin;
loop_statement
}

数组的开始结束迭代器(例如int a[size])可以很容易地通过a<找到a + size 分别为 iterators are generalizations of pointers 。因此,无论何时遍历数组(在基于范围的 for 循环中),编译器都应该知道底层数组的大小

在您的版本中,传递的数组将被推断为 int*(没有可用的大小信息)而不是实际类型 int a[5]

有几个选项可以将传递的数组推导为实际类型:

  • 选项 - 1:为数组的大小提供一个非类型参数,使用以下语法。
    template <typename T, std::size_t N>
    void forEachTest(T const (&a)[N])
    // ^^^^^^^^^^^^^^^^
    {
    for (int x : a)
    std::cout << x << std::endl;
    }
  • Option - 2:通过 const - reference 传递它,因为值不是在函数内部被修改。
    template <typename T>
    void forEachTest(T const (&a))
    // ^^^^^^^^^^^^
    {
    for (int x : a)
    std::cout << x << std::endl;
    }
  • 选项 - 3: forward the array perfectly 带有转发引用。
    template <typename T>
    void forEachTest(T&& a)
    // ^^^^^^
    {
    for (int x : a)
    std::cout << x << std::endl;
    }

关于c++ - 如何让 for_each 使用模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57620024/

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