C ++中不同类的方法映射

时间:2016-06-13 01:49:04

标签: c++ function pointers dictionary methods

我正致力于将键盘输入映射到函数。我已经完成了很大一部分,但现在我需要将一个字符串绑定到一个函数,这样当按下该字符串引用的键时,它将被调用。

我知道我可以使用 模板 void BindStringToAction(std :: string key,T * obj,R(T :: * methodPointer)(float));

但问题是将其存储以供继续使用。这些方法可以有一个基类,并且都可以具有相同的输入(float)和返回类型(void),但是将它们存储在地图中需要设置ClassName。

所以基本上问题是我如何存储字符串和方法指针的映射,后者可以在任何类中。

Unreal做同样的事情,但我无法找到实现或类似的信息。我找到了std :: function,但它也依赖于不同的类名,因此我无法为它制作地图。

1 个答案:

答案 0 :(得分:2)

使用C ++ 11,您可以使用lambdas来包装回调函数/方法。例如:

struct A {
    void callback(float in) {
        std::cout << "A : " << in << std::endl;
    }
};

struct B {
    void callback(float in) {
        std::cout << "B : " << in << std::endl;
    }
};

int main() {
    A a;
    B b;
    std::map<std::string, std::function<void(float)>> callbacks;
    callbacks["A"] = [&a](float in){a.callback(in);};
    callbacks["B"] = [&b](float in){b.callback(in);};

    callbacks["A"](3.14);
    callbacks["B"](42.);
}

输出结果为:

A : 3.14
B : 42

这样,回调是一个函数,一个方法还是一个lambda并不重要。我使用这个系统来做类似你正在做的事情,它运作得很好。