好的,这应该很简单,基本上下面的示例应该起作用(至少已编译):
class Foo {
public:
void DoNothing( void(Foo::*funcptr)() ){}
void CallDoNothing();
};
void Foo::CallDoNothing(){
auto closure = [this](){};
DoNothing(closure);
}
int main(){
return 0;
}
但是由于某种原因会触发编译错误
test.cpp: In member function ‘void Foo::CallDoNothing()’:
test.cpp:9:19: error: no matching function for call to ‘Foo::DoNothing(Foo::CallDoNothing()::__lambda0&)’
DoNothing(closure);
^
test.cpp:9:19: note: candidate is:
test.cpp:3:7: note: void Foo::DoNothing(void (Foo::*)())
void DoNothing( void(Foo::*funcptr)() ){}
^
test.cpp:3:7: note: no known conversion for argument 1 from ‘Foo::CallDoNothing()::__lambda0’ to ‘void (Foo::*)()’
我什至已经尝试投射:
DoNothing(reinterpret_cast< void(Foo::*funcptr)() >(closure));
,DoNothing(( void(Foo::*funcptr)() )closure);
,以及对此的一些变化—所有这些都触发了编译错误! 最佳答案
您为什么认为可以将lambda函数分配给成员函数指针? Lambda函数具有某些匿名类型。仅当它具有一个空捕获时,才可以将其分配给函数指针,但即使与示例中的成员函数指针也不兼容,也可以将其分配给函数指针。
您可以使用std::function<void ()>
或将DoNothing
用作模板函数。