我正在尝试在我的代码中使用此lambda表达式。似乎函子或lambda的定义有问题。
我相信lambda表达式是正确的。但是我不能满足我定义的函数原型。
函数定义:
template<typename E, typename container>
void for_each(Iterator<E,container> begin, std::function<void(E&)> fun)
{
do // does the given unary functor to elements
{ //from starting iterator 'til the end.
fun(*begin);
begin = begin.next();
}while(begin.hasNext());
fun(*begin);
}
呼叫者:
for_each(c.iterator(), [&](E& e){add(e);});
除了用lambda表达式实现此函数调用外,我都可以。但是编译器会说“错误:没有匹配的函数可以调用..”
答案 0 :(得分:1)
lambda不是std::function
,因此推论失败。
您可以简单地通过通用Functor
:
template<typename E, typename container, typename F>
void for_each(Iterator<E, container> begin, F&& fun)
{
// ...
}
答案 1 :(得分:0)
下面的代码和可能的解决方法问题:
1。 Lambda expression
不是std::function
,它只能存储在std::function
类型的对象中。
方法:(使用您现有的签名):
std::function<void()> f = []() -> void { // do something };
for_each(vec.begin(), vec.end(), f);
2。更好的解决方案是使用Callable
作为参数(转到答案的结尾)。
3。如果要提取自己的for_each
版本,为什么不遵循与其他算法一致的实现,或者不遵循算法标头中for_each
的实现。 < / p>
满足您的所有需求,并且与其他标准算法一致:en.cppreference.com/algorithms/for_each:
template<class InputIt, class UnaryFunction>
constexpr UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
for (; first != last; ++first) {
f(*first);
}
return f;
}