如何使for_each与模板一起使用?

Bla*_*per 5 c++ arrays foreach templates c++11

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

当我尝试对中的每个使用时main,它应该工作

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;
}
Run Code Online (Sandbox Code Playgroud)

JeJ*_*eJo 7

我是C ++的新手,正在尝试了解for_each的工作原理

如果您在此处将基于范围的for-loop表示for_each,则它只是基于迭代器的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
}
Run Code Online (Sandbox Code Playgroud)

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

在您的版本中,将推导所传递的数组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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项-2:通过const-reference传递它,因为未在函数内部修改值。
    template <typename T>
    void forEachTest(T const (&a))
    //              ^^^^^^^^^^^^
    {
     for (int x : a)
         std::cout << x << std::endl;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项-3:使用转发参考完美地转发阵列
    template <typename T>
    void forEachTest(T&& a)
    //               ^^^^^^
    {
     for (int x : a)
         std::cout << x << std::endl;
    }
    
    Run Code Online (Sandbox Code Playgroud)