"events"和成员函数指针的 C++ 映射

标签 c++ templates callback function-pointers pointer-to-member

我已经设法编写了一个模板类来像回调一样工作,从这个问题的已接受答案中学习 How to define a general member function pointer .

我希望有一个字符串键和回调值的映射,以便我可以调用与字符串匹配的正确回调。这很好,但我需要 map 来支持来自不同类的回调。现在它只能与一个类(class)一起工作。由于模板的原因,它可以是任何类,但只能是来自同一类的回调集合。

class Apple {
public:
    void Red () {
        cout << "aa";
    }
};

class Orange {
public:
    void Blue () {
        cout << "bb";
    }
};

template <typename T>
class Callback {
    T *obj;
    void (T::*ptr) (void);

public:
    Callback (T *obj, void (T::*ptr) (void)) : obj (obj), ptr (ptr) {

    }

    void Call () {
        (obj->*ptr) ();
    }
};

我可以这样用

Apple apple;
Orange orange;
Callback <Apple> callA (&apple, &Apple::Red);
Callback <Orange> callB (&orange, &Orange::Blue);
callA.call ();
callB.call ();

std::map <std::string, Callback <Apple>> appleCallbacks;

我希望能够做到这一点

std::map <std::string, Callback <anything>> anyCallbacks;

我计划将它与一堆类一起使用,这些类共享相同的基类并且在定义上具有彼此相同的功能,除了名称和它属于哪个类。

class Base { };

class ChildA : public Base {
public:
    void Talk ();
}

class ChildB : public Base {
public:
    void Walk ();
}

因此,如果这可行,我将能够将 Talk () 和 Walk () 都放入 map 中。

这完全有可能吗?还是我的观点一开始就有缺陷?

最佳答案

疯狂的谎言是这样的:不要将回调绑定(bind)到特定的类。相反,使用 std::function<Signature>对象并创建合适的函数对象:当你需要对不同的类进行操作时,你也需要对不同类型的对象进行操作。使用 std::function<...>应该可以解决问题,例如:

std::map<std::string, std::function<void()>> operations;
operations["talk"] = std::bind(&ChildA::Talk, ChildA());
operations["walk"] = std::bind(&ChildB::Walk, ChildB());
operations["talk"]();

关于 "events"和成员函数指针的 C++ 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19192130/

相关文章:

c++ - 在 C++ 中避免负值

c++ - uniform_real_distribution 没有给出均匀分布

c++ - 是否可以从较晚的模板参数推断或默认较早的模板参数?

html - LibreOffice 命令行使用模板转换

javascript - 多个 $.each 中的 setTimeout() 回调

c++ - 无法从 'cv::Mat *' 转换为 'const cv::Mat'

C++模板函数错误: template-id does not match any template declaration

c++ - for 循环初始化中的 auto 和 decltype

javascript - 我怎样才能让 JavaScript 代码执行等到带有脚本的 AJAX 请求被加载和执行?

java - 如何为mockito设置模拟对象方法调用的回调?