>我正在将指向成员函数的指针传递到模板函数中。像这样的东西,
Foo bar; /* bar.baz(...) is a function */
auto pnt = bar.baz;
passMmbFunc<...,decltype(pnt)>(...,pnt);
passMmbFunc
的相关部分看起来像这样,
template <..., typename D>
void map(..., D func) {
...
auto ret = func(someVal);
...
}
我假设调用指向成员函数的指针的语法与指向函数的常规指针相同,但事实并非如此。我收到以下错误,
error: must use '.*' or '->*' to call pointer-to-member function in 'func (...)', e.g. '(... ->* func) (...)'
从passMmbFunc
内部,我将如何称呼pnt?我知道如果你手边有相应类的对象,可以调用指向成员函数的指针。但是由于我将其作为参数传递,因此情况并非如此。那么,如果你只有一个指针而没有对象,那么是否可以调用指向成员函数的指针?
必须在对象上调用指向成员的指针函数 - 它不能作为独立函数工作。因此你的错误。 必须使用 .*
或 ->*
语法以某种Foo
调用baz
:
auto ptr_to_mem = &Foo::baz;
Foo f, *pf;
ptr_to_mem(); // error
(f.*ptr_to_mem)(); // ok
(pf->*ptr_to_mem()); // ok
在 C++ 中执行此操作的方法是将指向成员的指针与将用于调用它的对象绑定。该标准甚至提供了一个功能来做到这一点: std::bind
:
auto pnt = std::bind(&Foo::baz, bar);
pnt(); // this is the equivalent of bar.baz();
一个可能的混淆来源是,auto pnt = bar.baz;
实际上会在Python中做你想要的。只是不C++。