我正在尝试使用STL算法for_each而不在整个代码中扩散模板。 std::for_each希望通过值实例化MyFunctor类,但是自从其抽象以来就不能这样做。我创建了一个functor适配器类,该类传递一个指针,然后在适当时取消引用。

我的问题:

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); }

干杯,

戴夫

最佳答案

tr1::ref在这里可能会为您提供帮助---它是作为引用包装的,因此您可以通过引用将常规对象传递给绑定(bind),或者可以通过引用标准算法传递函数对象(甚至是抽象对象)。

// 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)
    );
}

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

09-07 07:33