【发布时间】:2016-02-06 12:21:08
【问题描述】:
我正在尝试创建以下类,我可以使用它来测试对象以查看它们是否通过了某些过滤器。
template <typename T>
class Filter
{
public:
typedef bool (*Functor)(const T&);
bool test(const T& t) {
return func(t);
}
void setTester(Functor f) {
func = f;
}
private:
Functor func;
};
如果我只是在全局命名空间中创建一个方法,这很好。
bool testFunc(const Object& obj)
{
return !obj.name().isEmpty();
}
void foo(const Object& obj)
{
Filter<Object> filter;
filter.setTester(testFunc);
filter.test(obj);
}
但我真正想要的是使用 lambda 函数,这样我就不必像这样创建所有过滤器方法。我希望能够即时创建它们。
void foo(const Object& object)
{
Filter<Object> filter;
filter.setTester([](const Object& object) {
return !object.name().isEmpty();
});
filter.test(object);
}
但是当我这样做时,我得到以下编译错误。
C2664: 'ov::Filter<T>::setTester' : cannot convert parameter 1 from 'ov::`anonymous-namespace'::<lambda0>' to 'bool (__cdecl *)(const T &)'
with
[
T=ov::Object
]
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
我已经阅读了其他关于将 lambda 函数作为函数指针传递的帖子,例如 this one,并且我知道它们无法捕获以使其正常工作。没关系,你可以看到我没有试图捕捉任何东西。
我正在使用 VS2010 编译我的代码。
那我做错了什么?
【问题讨论】:
-
我过去通过将方法设为模板以便它为我派生类型来解决这个问题,但在这种情况下我不能这样做,因为我正在复制函数指针到一个成员变量以供以后使用。
-
你能提供一个minimal, complete, and verifiable example吗?我无法重现。你确定你的 lambda 没有捕捉到什么吗?
-
您是否尝试在 lambda 之前使用 + ?喜欢:
+[](){}强制降级为函数指针:示例coliru.stacked-crooked.com/a/9a9559bf5b56637d
标签: c++ visual-studio-2010 c++11 lambda