如何解决Lambda 函数作为参数
我第一次使用 lambda。我应该编写一个函数 walk(),它以 lambda 函数为参数。
template<class T>
void walk(T operation) const;
我们应该在 .inl 中定义函数,我是这样做的:
template<class T>
void Sea::Grid2D<T>::walk(T operation) const{
for(auto a : Sea::Grid2D<T>::grid){
operation(a);
}
}
此时我的问题出现了,因为我们有一个测试类,它像这样调用我们的 walk() 函数。
grid.walk([&](int const &cell) { sum += cell; });
错误:无法将“testWalkAndFilter()::
43 | grid.walk([&](int const &cell) { sum += cell; });
我将如何将我的 lambda 函数转换为 int 或需要的参数?
同时试图解决这个问题。我还尝试给 walk 函数一个引用,或者一个 const 引用参数,但到目前为止没有任何效果。
解决方法
您已经实例化了 Sea::Grid2D<int>
- 也就是说,T
是 int
- 这给了您:
void Sea::Grid2D<int>::walk(int operation) const {
for(auto a : Sea::Grid2D<int>::grid) {
operation(a);
}
}
很明显有打字问题 - 操作的类型不应该与您的网格元素的类型相同。
由于类模板中有函数模板,因此需要两个“级别”的模板,例如:
template<class T>
class Grid2D {
...
template <class Fn>
void walk(Fn operation) const;
...
};
...
template<class T>
template <class Fn>
void Sea::Grid2D<T>::walk(Fn operation) const {
for(auto a : grid) {
operation(a);
}
}
,
您可能将名称 T
用于 2 个不同的参数(我猜一个在 Grid2D 类级别,一个在此函数上)。
template<class T>
void Sea::Grid2D<T>::walk(T operation) const{
for(auto a : Sea::Grid2D<T>::grid){
将此重命名为其他名称。比如,U
。
但如果可能的话,最好给他们起一个能反映意图的名字。例如,Callable
或 Operation
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。