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)()
将首先尝试调用,然后取消引用,但应该是另一种方式。