C++ std::for_each中的多态函子

C++ std::for_each中的多态函子,c++,stl,polymorphism,C++,Stl,Polymorphism,我试图在代码中使用stl算法,而不增加模板。for_每个人都想通过值实例化MyFunctor类,但由于其抽象性,所以不能。我创建了一个函子适配器类,它传递一个指针,然后在适当的时候取消它的引用 我的问题: STL或Boost是否已经有这样的适配器类?我不想重新发明轮子 struct MyFunctor { virtual ~MyFunctor() {} virtual void operator()(int a) = 0; } namespace { t

我试图在代码中使用stl算法,而不增加模板。for_每个人都想通过值实例化MyFunctor类,但由于其抽象性,所以不能。我创建了一个函子适配器类,它传递一个指针,然后在适当的时候取消它的引用

我的问题:

STL或Boost是否已经有这样的适配器类?我不想重新发明轮子

 struct MyFunctor  {
     virtual ~MyFunctor() {}
     virtual void operator()(int a) = 0; 
 }

 namespace {
     template<typename FunctorType, typename OperandType> struct
 FunctorAdapter
     {
         FunctorAdapter(FunctorType* functor) : mFunctor(functor) {}
         void operator()(OperandType& subject)
         {
             (*mFunctor)(subject);
         }

         FunctorType* mFunctor;
     }; }

 void applyToAll(MyFunctor &f) {
     FunctorHelper<MyFunctor, int> tmp(&f);
     std::for_each(myvector.begin(), myvector.end(), tmp); }
struct MyFunctor{
虚拟~MyFunctor(){}
虚空运算符()(int a)=0;
}
名称空间{
模板结构
函子适配器
{
FunctorAdapter(FunctorType*functor):mFunctor(functor){}
void运算符()(操作数类型和主题)
{
(*主办方)(主题);
}
FunctorType*mFunctor;
}; }
无效应用程序调用(MyFunctor&f){
FunctorHelper tmp&f;
std::for_each(myvector.begin(),myvector.end(),tmp);}
干杯


Dave

您可以使用
functional
中的功能适配器(及其垫片)

#include <functional>

using namespace std;
for_each( vec.begin(), vec.end(), :mem_fun_ptr( &MyClass::f ) );

有了更多的参数,您可以自己创建一个循环,或者创建一个自定义的functor,其中包含表示参数的常量成员变量。

忘记functor指针的所有包装,而是使用
bind(functor\u指针,mem\u fun1(&MyFunctor::operator());

作为函子?这样,您就不必担心以任何形式或形状管理副本。

为什么不使用BOOST\u FOREACH


听起来你可以从中受益


如果我没记错的话,它也是一个只包含标题的库,所以很容易使用它。

基于@xtofl的答案,因为数组包含int而不是“this”指针,我认为正确的咒语是

class MyClass
{
  virtual void process(int number) = 0;
};
MyClass *instance = ...;

for_each( vec.begin(), vec.end(), binder1st(instance, mem_fun_ptr(&MyClass::process) );
与@xtofl代码的唯一区别是binder1st而不是binder2nd。binder2nd允许您将相同的数字传递给不同的“this”指针。binder1st允许您将不同的数字传递给一个“this”指针。

tr1::ref在这里可能会对您有所帮助——它是一个引用包装器,这样您就可以通过引用将普通对象传递给绑定,或者通过引用标准算法将函数对象(甚至是抽象对象)传递给标准算法

// requires TR1 support from your compiler / standard library implementation
#include <functional>

void applyToAll(MyFunctor &f) {
    std::for_each(
        myvector.begin(), 
        myvector.end(), 
        std::tr1::ref(f) 
    ); 
}
//需要编译器/标准库实现提供TR1支持
#包括
无效应用程序调用(MyFunctor&f){
std::每个(
myvector.begin(),
myvector.end(),
std::tr1::ref(f)
); 
}

但是,请注意,不支持decltype的编译器可能会拒绝传递对抽象类型的引用…因此,在获得C++0x支持之前,此代码可能无法编译。

回答得好,我不清楚他的示例,但是如果向量包含int,他不也需要绑定一个“this pointer”吗到那个mem_fun?不,因为this指针将作为for_each的参数传递。成员函数指针将处理虚拟查找。我无法理解为什么这得到的票数比正确答案多;它不能按要求处理functor对象。看起来我在FunctorAdapter中实现了类似于Reference的东西tr1::ref返回的ence\u包装器。
// requires TR1 support from your compiler / standard library implementation
#include <functional>

void applyToAll(MyFunctor &f) {
    std::for_each(
        myvector.begin(), 
        myvector.end(), 
        std::tr1::ref(f) 
    ); 
}