Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中不同类的方法映射+;_C++_Function_Pointers_Dictionary_Methods - Fatal编程技术网

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

C++ C+中不同类的方法映射+;,c++,function,pointers,dictionary,methods,C++,Function,Pointers,Dictionary,Methods,我正在将键盘输入映射到函数。我已经完成了其中很大一部分,但是现在我需要将一个字符串绑定到一个函数,这样当按下引用该字符串的键时,它将被调用 我知道我可以用 模板 void BindStringToAction(std::string键,T*obj,R(T::*methodPointer)(float)) 但问题是要将其储存起来以供继续使用。这些方法可以有一个基类,并且都可以有相同的输入(float)和返回类型(void),但是将它们存储在映射中需要一个设置的类名 所以本质上的问题是如何存储字符串

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

我知道我可以用 模板 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