2016-06-13 54 views
1

我正在将键盘输入映射到函数。我做了很大一部分,但现在我需要将一个字符串绑定到一个函数,以便当该字符串引用的键被按下时,它将被调用。我知道我可以使用 模板 void BindStringToAction(std :: string key,T * obj,R(T :: * methodPointer)(float));来自C++中不同类的方法的地图

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

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

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

+0

你可以编写一个Builder来构建地图,然后存储一个名为'pair '的列表,它可以作为一组指令给Builder。这是否足够? – Beta

+0

在C++中,不存在“指向任何类的方法指针”。你所要求的是不可能的。你必须找出一种不同的方式来完成你想要完成的任何事情。 XY问题。 –

+2

'std :: function f = [=](float val){obj-> methodPointer(val); };'。现在将它存储在'std :: map >' –

回答

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 

这样,如果你的回调函数,方法或拉姆达也没关系。我使用这个系统来做类似于你正在做的事情,并且它工作得很好。

+0

是否可以转换一个函数,以便其他开发人员不需要使用lambdas?类似: 模板 空隙写(T * OBJ,R(T :: * methodPointer)(浮点)){ \t的std ::函数一个= [OBJ](漂浮在) {methodPointer(in); }; \t a(1); } –

+1

好吧,因为lambda易于使用,现在很常见,我强烈建议您和您合作的开发人员使用它们。他们非常方便,你会发现许多使用它们会简化你的代码的情况 –

相关问题