【问题标题】:Map of methods from different classes in C++C++ 中不同类的方法映射
【发布时间】:2016-06-13 01:49:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以编写一个 Builder 来构建地图,然后存储一个列表,例如 pair<string, string>,它将作为 Builder 的一组指令。这样就够了吗?
  • 在 C++ 中没有“指向任何类的方法指针”这样的东西。你要求的是不可能的。你必须想出一种不同的方法来完成你想要完成的任何事情。 XY 问题。
  • std::function<void(float)> f = [=](float val) { obj->methodPointer(val); };。现在将其存储在std::map<std::string, std::function<void(float)>>

标签: c++ function pointers dictionary methods


【解决方案1】:

使用 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 都无关紧要。我将此系统用于与您正在做的事情类似的事情,并且效果很好。

【讨论】:

  • 是否可以转换一个函数,使其他开发人员不需要使用 lambdas?类似于: template void write(T* obj, R(T::*methodPointer)(float)) { std::function a = [obj](float in) { 方法指针(输入); };一个(1); }
  • 好吧,既然 lambdas 易于使用并且现在很常见,我强烈建议您和与您一起工作的开发人员使用它们。它们非常方便,您会发现在很多情况下使用它们会简化您的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多