我正在尝试使用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支持之前,此代码可能无法编译。