如何调用成员函数指针?

时间:2014-06-20 10:52:10

标签: c++ c++11 syntax member-function-pointers

我在Ubuntu 12.04 LTS 32位上使用带有GNU工具链的C ++ 11。我知道有类似的问题已被提出,但我还没有找到这个问题,而且我无法从已发布的内容中得到任何结果,所以这里有:

我有这样的代码:

enum class FUNC_TYPES { FUNCTYPE_1,FUNCTYPE_2,FUNCTYPE_3};

class AClass
{
...

typedef void (AClass::* TFunc )( );
std::map<FUNC_TYPES, TFunc> mFuncMap;


void doStuff();

....

}

我像这样初始化mFuncMap:

void AClass::initFuncMap( )
{
    mFuncMap[FUNC_TYPES::FUNCTYPE_1] = & AClass::doStuff;
}

所有这些都很好。

现在我想调用映射函数指针。

我尝试过这种形式,我知道这种形式适用于不适用于成员函数的函数指针。

mFuncMap[FUNC_TYPES::FUNCTYPE_1]( );

这会产生很长的解释性编译错误:

  

错误:必须使用'。'或' - &gt; '来调用指向成员的指针函数   (AClass *)this) - &gt; AClass :: mFuncMap.std :: map&lt; _Key,_Tp,_Compare,   _Alloc&GT; ...

我尝试了几乎可以想到的每种形式的去引用,我从搜索中找到了 - 用括号,没有它们等等等......但是我无法正确地使用语法来进行此调用。

调用映射成员函数的正确语法是什么?我的声明或初始化是否有问题导致了这个问题?

1 个答案:

答案 0 :(得分:3)

这与地图无关,与typedef无关。 You have a pointer-to-member-function and you're not invoking it properly

您需要AClass来运行该功能:

AClass& a = someAClassSomewhere();
(a.*(mFuncMap[FUNC_TYPES::FUNCTYPE_1]))();

当然这非常难看,所以请考虑提前绑定对象:

typedef std::function<void()> TFunc;
std::map<FUNC_TYPES, TFunc> mFuncMap;

// ...

mFuncMap[FUNC_TYPES::FUNCTYPE_1] = std::bind(&AClass::doStuff, this);

// ...

mFuncMap[FUNC_TYPES::FUNCTYPE_1]();

live demo