C ++ 11:如何将std :: mem_fn和std :: bind与继承一起使用

时间:2014-01-14 15:22:13

标签: c++ c++11 lambda bind member

我需要能够拥有一个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"; }
};  

1 个答案:

答案 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");
}