【发布时间】:2018-04-09 11:57:49
【问题描述】:
我尝试编写一个 forEach 方法(我知道已经存在但我会自己尝试)
这是我的代码:
#include <iostream>
#include <array>
#include <functional>
using namespace std;
template<typename T, std::size_t SIZE>
void forEach(std::array<T, SIZE> array, function<void(int)> fun){
for(auto const & object: array)
fun(object);
}
int main()
{
std::array<int, 4> num{1,2,3,4};
forEach(num, [](int n) -> void { cout << n * n << endl;});
return 0;
}
这很好用。
现在,当我将 forEach function<void(int)> fun 的第二个参数更改为 function<void(T)> fun 时,它无法编译并且出现错误:no matching function for call to 'forEach(std::array<int, 4u>&, main()::<lambda(int)>)'
但是当我正确理解时,T 在这个例子中应该是int。
我会犯思维错误吗?
为什么它不起作用?
当我这样做时它会起作用:
template<typename T, std::size_t SIZE>
void forEach(std::array<T, SIZE> array, function<void(T)> fun){
for(auto const & object: array)
fun(object);
}
int main()
{
std::array<int, 4> num{1,2,3,4};
function<void(int)> func = [](int n) -> void { cout << n * n << endl;};
forEach(num, func);
return 0;
}
但是我可以像第一个代码sn-p那样直接在函数调用中做吗?
提前致谢
【问题讨论】:
-
Lambda 不是
std::function,所以没有有效的扣除。 -
但是当 lambda 不是
std::function时,为什么这在参数中起作用:function<void(int)> fun -
可能重复:[我无法将 lambda 作为 std::function 传递](stackoverflow.com/questions/36030589/…)
-
我猜第二个有效,因为存在隐式转换。在模板类型推导中,没有隐式转换,因此失败。当直接指定类型时,它就像现在从 lambda 到 std::function 的隐式转换一样。
标签: c++