(成员)函数指针的Vector的Vector

Vector of Vector of (member) function pointers

本文关键字:Vector 指针 函数 成员      更新时间:2023-10-16

我正在为我当前的实验项目构建一个简单的侦听器/回调机制。我坚持实现一个容器结构似乎应该是向量的向量的指针。我选择这种方式,因为我希望根向量简单的事件类型的关键,让我们说,是一个enum (int),然后在这个关键,我想存储指针的向量到这个事件类型的可用方法。在逻辑表示中,类似于:

[EVENT_TYPE_QUIT]
                 [ptr1]
                 [ptr2]
                 [ptr3]
                 [ptr4]
                 [....]
[EVENT_TYPE_HELLO]
                 [....]
                 [....]
typedef enum {
   EVENT_TYPE_QUIT,
   EVENT_TYPE_HELLO,
   ...
} EventType;

因此简化的实现看起来像这样(它实际上是一个模板,但是想象T是任何可以映射事件的用户类型)。

class EventMapper {
    ...
    typedef void (T::*functionPtr)(); // simple pointer to T member function with no args.
    std::vector< std::vector<functionPtr> > eventCallbacks;
    void mapEvent(const EventType type, functionPtr callback) {
        // here i need to map type to callback
        // each type can have multiple callbacks
        // T can have only distinct event types as "key"
        // this i tried but doesn't work
        eventCallbacks[type].push_back(callback);
    }
    ...
}

预期的实现看起来像:

EventMapper<SupaDupaClass> mapper;
mapper.mapEvent(EVENT_TYPE_HELLO, &SupaDupaClass::didYouSayHello);

等等……

我真的想使用向量而不是映射更容易唯一的键分配?谢谢你

如果我没看错你的代码,你正在访问一个未初始化的条目。

你应该首先用空向量初始化eventcallback,比如

eventCallbacks.assign (10, std::向量())

您可以使用std::map将event_type映射到回调向量。考虑使用std::function而不是函数指针以获得灵活性。

一个可能的实现是:

#include <vector>
#include <map>
#include <functional>
#include <iostream>
enum class event_type
{
    event_one,
    event_two
};
void func1() { std::cout << "func1" << std::endl; }
class my_listener { public: void func() { std::cout << "my_listener::func" << std::endl; } };
int main()
{
    std::map<event_type, std::vector<std::function<void ()>>> m;
    my_listener lst;
    m[event_type::event_one].push_back(std::bind(&my_listener::func, lst));
    m[event_type::event_one].push_back(&func1);
    // invoke callbacks (may be used in the code that raises events)
    for(auto& kv : m)
    {
        for(auto& f : kv.second) {
            f();
        }
    }
    return 0;
}
编辑:

您可以考虑使用Boost。Signals2图书馆。