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
匹配
请帮忙,谢谢。
bar
和 jar
是成员函数。它们将指针 - this
作为第一个隐藏参数,你不能将它们视为自由函数。而且您不能通过指向它们的指针将它们包装到 function<void(void)>
- 您现在正在做的事情。
您应该使用 std::bind
将 this
绑定到成员函数(或使用 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::
才能获得指向非静态成员函数的指针。 &bar
或 bar
都不允许像自由函数那样使用。
我很难将 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
匹配请帮忙,谢谢。
bar
和 jar
是成员函数。它们将指针 - this
作为第一个隐藏参数,你不能将它们视为自由函数。而且您不能通过指向它们的指针将它们包装到 function<void(void)>
- 您现在正在做的事情。
您应该使用 std::bind
将 this
绑定到成员函数(或使用 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::
才能获得指向非静态成员函数的指针。 &bar
或 bar
都不允许像自由函数那样使用。