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)
我是C ++的新手,正在尝试了解for_each的工作原理
如果您在此处将基于范围的for-loop表示为for_each,则它只是基于迭代器的loop的语法糖,它可用于定义了begin和end成员函数的任何对象。
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]可以容易地通过a和a + size分别找到,因为迭代器是指针的概括。因此,无论何时遍历数组(在基于范围的循环中for),编译器都应该知道size底层数组的。
在您的版本中,将推导所传递的数组int*(没有可用的大小信息),而不是实际类型int a[5]。
很少有选择,通过这些选择可以将传递的数组推导为实际类型:
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)template <typename T>
void forEachTest(T const (&a))
// ^^^^^^^^^^^^
{
for (int x : a)
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)template <typename T>
void forEachTest(T&& a)
// ^^^^^^
{
for (int x : a)
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)