在stl地图中存储仿函数并调用它们

时间:2012-11-16 13:24:47

标签: c++ stl

我正在尝试将functors存储在stl map中,然后逐个调用它,但现在确定如何调用它。这是我到目前为止所尝试过的。

#include <iostream>
#include <map>
#include <string>

class BaseFunctor {
public:
  BaseFunctor() {
  }
  ~BaseFunctor() {
  }
};

template <typename T>
class MyFunctor : public BaseFunctor {
   public:
     T operator()(T x) { 
       return x * 2;
     }
};

int main ( int argc, char**argv ) {
  std::map<std::string, BaseFunctor*> m_functorMap;

  m_functorMap.insert(std::make_pair("int", new MyFunctor<int>()));
  m_functorMap.insert(std::make_pair("double", new MyFunctor<double>()));
  m_functorMap.insert(std::make_pair("float", new MyFunctor<float>()));
  m_functorMap.insert(std::make_pair("long", new MyFunctor<long>()));

  for ( std::map<std::string, BaseFunctor*>::iterator itr = m_functorMap.begin(); itr != m_functorMap.end(); ++itr ) {
    std::cout << *(itr->second)() << std::endl;
  }


  return 0;
}

我无法使用boost

1 个答案:

答案 0 :(得分:4)

您的地图中包含BaseFunctor*,但BaseFunctor无法调用,因为它没有operator()。如果不转换为派生类型的指针,最好使用dynamic_cast,则无法调用。总的来说,它看起来不是一个好的设计。您试图在不能使用的情况下使用运行时多态性。