(成员)函数指针的Vector的Vector
Vector of Vector of (member) function pointers
我正在为我当前的实验项目构建一个简单的侦听器/回调机制。我坚持实现一个容器结构似乎应该是向量的向量的指针。我选择这种方式,因为我希望根向量简单的事件类型的关键,让我们说,是一个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图书馆。
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 我无法使用C++指针指向类方法返回的 std::vector
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 指向基类的指针的 std::vector 的深层副本
- 从 std::vector 迭代器中执行函数指针
- 将 std::vector::d ata 传递给函数期望类型**(双指针)
- 根据指针条件初始化std::vector
- 释放 std::vector 中指针内存的最有效方法是什么?
- 在实现 std::vector 时,我必须拥有 end() 的"end"指针吗?
- 将双指针作为参数传递给需要引用 std::vector <double>的函数
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将此类的智能指针追加到成员 std::vector
- 为什么 std::vector<>::const_reference 可以转换为非常量指针?
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 带有 std::vector 的指针算术
- 从vector<指针*>vector<指针*比;在c++中
- 如何获取指向原始数据的std::vector指针
- c++的vector指针,vector的声明和指针的删除