std :: for_each中的多态仿函数

Dav*_*ier 4 c++ polymorphism stl

我正在尝试使用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); }
Run Code Online (Sandbox Code Playgroud)

干杯,

戴夫

xto*_*ofl 5

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

#include <functional>

using namespace std;
for_each( vec.begin(), vec.end(), :mem_fun_ptr( &MyClass::f ) );
Run Code Online (Sandbox Code Playgroud)

如果容器包含指向对象的指针,请使用mem_fun_ptr,否则使用mem_fun.在这些之后,有成员函数的包装器,它们带有1个参数:mem_fun1_ptrmem_fun1.

@Evan:的确,您可以使用每个对象的相同参数调用成员函数.mem_fun1包装器的第一个参数是this指针,第二个是成员函数参数:

for_each( vec.begin(), vec.end(), bind2nd( mem_fun_ptr( &MyClass::f ), 1 ) );
Run Code Online (Sandbox Code Playgroud)

使用更多参数,自己创建循环变得更具可读性,或者创建具有表示参数的const成员变量的自定义函子.