我需要能够拥有一个Base类,它可以存储指向成员函数的指针,不仅用于它自己的方法,还用于子类。以下是我想要使用LAMBDAS的示例,但我希望能够使用成员函数来实现:
struct Base
{
void registerFunc(std::string const& name, std::function<void *(void *)> code)
{
functionTable_[name] = code;
}
void *invokeFunc(std::string const& name, void *arg)
{
auto x = functionTable_[name];
auto func = std::bind(x, _1);
return func(arg);
}
Base()
{
registerFunc("hello", [this](void *arg) { printf("hello"); return nullptr; });
invokeFunc("hello");
}
private:
std::unordered_map<std::string, std::function<void *(void *)>> functionTable_;
};
struct Derived : Base
{
Derived()
{
registerFunc("world", [this] (void *arg) { printf("world"); return nullptr; });
invokeFunc("world");
}
// Instead of lambdas, I would like to be able to put member
// functions like this into the std::unordered_map of the Base class
void *memberFunc(void *arg) { printf("oyoyoy"; }
};
答案 0 :(得分:2)
首先,您的invokeFunc
方法不需要使用std::bind()
,至少应检查功能是否存在:
void *invokeFunc(std::string const& name, void *arg)
{
auto &x = functionTable_[name];
if( !x ) return 0;
return x(arg);
}
但更好的是使用std::map::find()
我相信
其次,您可以使用std::bind()
传递方法:
Derived()
{
registerFunc("world", [this] (void *arg) { printf("world"); return nullptr; });
invokeFunc("world");
registerFunc("method", std::bind( &Derived::memberFunc, this, _1 ) ) );
invokeFunc("method");
}