class 自身内部的映射函数 class 成员

Map function class member inside class itself

我很难将 class 成员的功能映射到 class 本身

#include <functional>
#include <map>
#include <string>

class Foo{
    public:
    void bar() {}
    void jar() {}

    private:
    std::map<std::string, std::function<void(void)>> myMap =
    {
        {"bar", bar},
        {"jar", jar}
    };
};

编译器说不

严重性代码说明项目文件行抑制状态抑制状态 错误(活动)E0289 没有构造函数实例 "std::map<_Kty, _Ty, _Pr, _Alloc>::map [with _Kty=std::string, _Ty=std::function, _Pr=std::less, _Alloc=std::allocator>>]" 与参数列表 Whosebug C:\Whosebug\Foo.h 13

匹配

请帮忙,谢谢。

barjar 是成员函数。它们将指针 - this 作为第一个隐藏参数,你不能将它们视为自由函数。而且您不能通过指向它们的指针将它们包装到 function<void(void)> - 您现在正在做的事情。

您应该使用 std::bindthis 绑定到成员函数(或使用 lambda 表达式):

std::map<std::string, std::function<void(void)> > myMap2 =
{
    {"bar", std::bind(&Foo::bar,this)},
    {"jar", std::bind(&Foo::jar,this)}
};

或存储指向函数的指针:

std::map<std::string, void (Foo::*)(void) > myMap =
{
    {"bar", &Foo::bar},
    {"jar", &Foo::jar}
};

@rafix07 回答的一些替代方案:

将 lambda 与 this 捕获结合使用:

std::map<std::string, std::function<void(void)> > myMap2 =
{
    {"bar", [this]{ bar(); }},
    {"jar", [this]{ jar(); }}
};

或将成员函数指针放入std::function:

std::map<std::string, std::function<void(Foo*)> > myMap2 =
{
    {"bar", &Foo::bar},
    {"jar", &Foo::jar}
};

请注意,需要符号 &Foo:: 才能获得指向非静态成员函数的指针。 &barbar 都不允许像自由函数那样使用。