C++ 将函子存储在stl映射中并调用它们

C++ 将函子存储在stl映射中并调用它们,c++,stl,C++,Stl,我试图将函子存储在stl映射中,然后逐个调用它,但现在确定了如何调用它。这就是我迄今为止所尝试的 #include <iostream> #include <map> #include <string> class BaseFunctor { public: BaseFunctor() { } ~BaseFunctor() { } }; template <typename T> class MyFunctor : public

我试图将
函子
存储在
stl映射中
,然后逐个调用它,但现在确定了如何调用它。这就是我迄今为止所尝试的

#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;
}
#包括
#包括
#包括
类基函子{
公众:
基函子(){
}
~BaseFunctor(){
}
};
模板
类MyFunctor:PublicBaseFunctor{
公众:
T运算符()(T x){
返回x*2;
}
};
int main(int argc,字符**argv){
标准::映射m_函数映射;
m_functorMap.insert(std::make_pair(“int”,new MyFunctor());
m_functorMap.insert(std::make_pair(“double”,new MyFunctor());
m_functorMap.insert(std::make_pair(“float”,new MyFunctor());
m_functorMap.insert(std::make_pair(“long”,new MyFunctor());
对于(std::map::迭代器itr=m_functorMap.begin();itr!=m_functorMap.end();++itr){

std::cout second)(您有一个满是
BaseFunctor*
的映射,但是
BaseFunctor
不可调用,因为它没有
操作符()
。如果不强制转换到派生类型的指针,则无法调用,最好使用
动态强制转换。
。总体而言,它看起来不是一个好的设计。您正试图在无法使用的地方使用运行时多态性。

您有一个满是
BaseFunctor*
的映射,但是
BaseFunctor
无法调用,因为它没有
操作erator()
。如果不强制转换到派生类型的指针,则无法调用,最好使用
动态\u强制转换
。总的来说,它看起来不是一个好的设计。您正在尝试使用运行时多态性,但它不能使用。

是否有理由说
functor
带有邪恶引号?运算符优先级要求
(*itr->second)(
。在您的例子中,每个派生函子返回不同的类型,您必须处理这个问题,这取决于您正试图如何处理返回的值(不知何故,我认为
无法
处理它们才是您真正想要做的事情)@vladr:我有一套基于类型的
write
函数,我目前有一个大的
if
循环,我正试图避免这个循环,我在考虑
函数指针
,但是类型不同,所以不能将它们存储在映射中,也不允许
boost
。但是在进一步移动之前,你的
写什么方法看起来是这样的,它们是你要重写的(还是你无法控制它们?),还有你试图跨越的另一边是什么?(也就是说,你从哪里得到你试图最终写入的
/
/等值?从一个文件中解析它们?文件格式和解析它的代码大致是什么样子?)你有没有理由说带有邪恶引号的
functor
?操作符优先级要求
(*itr->second)()
。假设在您的例子中,每个派生函子返回不同的类型,您必须处理这个问题,这取决于您正试图对返回的值做什么(不知何故,我不认为
cout
ing它们才是您真正想做的)@vladr:我有一套基于类型的
write
函数,我目前有一个大的
if
循环,我正试图避免这个循环,我在考虑
函数指针
,但是类型不同,所以不能将它们存储在映射中,也不允许
boost
。但是在进一步移动之前,你的
写什么方法看起来是这样的,它们是你要重写的(还是你无法控制它们?),还有你试图跨越的另一边是什么?(也就是说,你从哪里得到
long
/
double
/等你试图最终写入的
值?从文件中解析它们?文件格式和解析它的代码大致是什么样子的?)当这被修复时,他会有问题,因为
操作符()
绑定比
操作符*
更紧,因此
*(itr->second)(
将首先尝试调用,然后取消引用,但应该是另一种方式。当这一问题得到解决时,他会遇到问题,因为
操作符()
绑定比
操作符*
更紧,所以
*(itr->second)()
将首先尝试调用,然后取消引用,但应该是另一种方式。