C++,指向函数向量的指针的STL映射

c++, stl map of pointers to functions vectors

本文关键字:指针 STL 映射 向量 函数 C++      更新时间:2023-10-16

我在创建定义为主题的结构时似乎遇到了一些问题。

我的目标是创建一种事件处理程序(不管它是好编程还是坏编程,或者它不是多线程:目前只是为了练习)。

然后我的想法是创建一个指向函数的指针向量,并将该向量放在映射中,其中键是一个字符串。

我一定是在概念上做错了什么,因为我得到了一些奇怪的错误:我的代码如下(错误在最后):

.h file
//ptr to function
typedef int (*pt2Function)(void*);
typedef std::vector<pt2Function> fPtrVector;
class eventDispatcher
{
public:
    //stuff 
    void addListener(std::string,pt2Function);
protected:
    //stuff
     std::map<std::string,fPtrVector> _listeners;
};

这是CPP:

.cpp file
void eventDispatcher::addListener(std::string eventName ,pt2Function function)
{
  std::map<std::string,fPtrVector>::iterator it;
  it=this->_listeners.find(eventName);
  if(it != this->_listeners.end())
  {
//do something
  }
  else 
  {
    std::vector<pt2Function> tmp;
    tmp.insert(function);  // here occurs error 1
    this->_listeners.insert(eventName,tmp);  // here occurs error 2
    std::cout<<"cnt: "<< this->_listeners.count(); 
  } 

}

我得到的错误是:

1)  no matching function for call to 'std::vector <int (*)(void*), std::allocator<int (*)(void*)> >::insert(int (*&)(void*))'
2)  no matching function for call to 'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<int (*)(void*), std::allocator<int (*)(void*)> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<int (*)(void*), std::allocator<int (*)(void*)> > > > >::insert(std::string&, std::vector<int (*)(void*), std::allocator<int (*)(void*)> >&)'

如果你检查对insert的引用,你会发现它需要两个参数,一个迭代器和值。要仅添加值,请使用例如push_back

对于地图,您可以改用_listeners[eventName] = tmp;

std::vector::insert()的变体不需要单个参数:所有迭代器都采用一个迭代器,指示新元素之前必须插入的位置。改用std::vector::push_back()添加function

std::map::insert() 有几个变体,但您尝试使用的变体采用map value_type,定义为:

value_type  std::pair<const Key, T>

在您的情况下,value_type是一个std::pair<std::string, fPtrVector>

this->_listeners.insert(std::pair(eventName,tmp));

1) std::vectorinsert()方法通过使用迭代器指定位置来工作。对于您的情况,您可以使用 push_back() .

2) 使用 insert(std::make_pair(eventName, tmp)),这将通过映射创建所需的值类型。

  1. 您正在寻找std::vector::push_back(请参阅此处的文档以获取std::vector)。

  2. 您正在寻找std::map::operator [](请参阅此处的文档以获取std::map)。