C++ std::for_each中的多态函子
我试图在代码中使用stl算法,而不增加模板。for_每个人都想通过值实例化MyFunctor类,但由于其抽象性,所以不能。我创建了一个函子适配器类,它传递一个指针,然后在适当的时候取消它的引用 我的问题: STL或Boost是否已经有这样的适配器类?我不想重新发明轮子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
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)
);
}