调用指向传递给函数

时间:2015-04-26 19:44:42

标签: c++ function templates pointer-to-member

我将指向成员函数的指针传递给模板函数。像这样的东西,

    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?我知道如果你有一个方便的相应类的对象,可以调用指向成员函数的指针。但由于我将其作为参数传递,情况并非如此。那么,如果你只有一个指针而没有对象,那么无论如何都要调用指向成员函数的指针吗?

1 个答案:

答案 0 :(得分:0)

必须在对象上调用指向成员的指针函数 - 它不能作为独立函数工作。因此你的错误。必须使用bazFoo语法使用.*调用->*

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 ++。