我正致力于将键盘输入映射到函数。我已经完成了很大一部分,但现在我需要将一个字符串绑定到一个函数,这样当按下该字符串引用的键时,它将被调用。
我知道我可以使用 模板 void BindStringToAction(std :: string key,T * obj,R(T :: * methodPointer)(float));
但问题是将其存储以供继续使用。这些方法可以有一个基类,并且都可以具有相同的输入(float)和返回类型(void),但是将它们存储在地图中需要设置ClassName。
所以基本上问题是我如何存储字符串和方法指针的映射,后者可以在任何类中。
Unreal做同样的事情,但我无法找到实现或类似的信息。我找到了std :: function,但它也依赖于不同的类名,因此我无法为它制作地图。
答案 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并不重要。我使用这个系统来做类似你正在做的事情,它运作得很好。