C++ C+中不同类的方法映射+;
我正在将键盘输入映射到函数。我已经完成了其中很大一部分,但是现在我需要将一个字符串绑定到一个函数,这样当按下引用该字符串的键时,它将被调用 我知道我可以用 模板 void BindStringToAction(std::string键,T*obj,R(T::*methodPointer)(float)) 但问题是要将其储存起来以供继续使用。这些方法可以有一个基类,并且都可以有相同的输入(float)和返回类型(void),但是将它们存储在映射中需要一个设置的类名 所以本质上的问题是如何存储字符串和方法指针的映射,后者可以在任何类中C++ C+中不同类的方法映射+;,c++,function,pointers,dictionary,methods,C++,Function,Pointers,Dictionary,Methods,我正在将键盘输入映射到函数。我已经完成了其中很大一部分,但是现在我需要将一个字符串绑定到一个函数,这样当按下引用该字符串的键时,它将被调用 我知道我可以用 模板 void BindStringToAction(std::string键,T*obj,R(T::*methodPointer)(float)) 但问题是要将其储存起来以供继续使用。这些方法可以有一个基类,并且都可以有相同的输入(float)和返回类型(void),但是将它们存储在映射中需要一个设置的类名 所以本质上的问题是如何存储字符串
Unreal也做了同样的事情,但我找不到实现或类似的信息。我找到了std::function,但它也依赖于不同的类名,因此我无法为它创建映射 使用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.);
}
这样,回调是函数、方法还是lambda都无关紧要。我使用这个系统做一些类似于您正在做的事情,它工作得很好。您可以编写一个生成器来构建地图,然后存储一个列表,比如说,
对
,作为生成器的一组说明。这是否足够?C++中没有“任何方法指针”之类的东西。你所要求的是不可能的。你必须想出一种不同的方法来完成你想要完成的事情。XY问题。std::函数f=[=](float val){obj->methodPointer(val);}代码>。现在将其存储在std::map
中,是否可以转换函数,以便其他开发人员不需要使用lambdas?类似于:template void write(T*obj,R(T::*methodPointer)(float)){std::function a=[obj](float in){methodPointer(in);};a(1);}既然lambda很容易使用,而且现在非常常见,我强烈建议您和您的开发人员使用它们。它们非常方便,您会发现在很多情况下使用它们可以简化代码
A : 3.14
B : 42