Вот сразу два варианта:
1) Путем наследования от интерфейса, это если можно править классы функторов.
2) Путем шаблонного наследования от интерфеса, это если нельзя править классы функторов.
Все функторы в моих руках и, как обычно, они очень просты. Приведенный Вами код понятен - да, можно сделать функторам общую базу, а можно и обернуть. Указатели на созданные экземпляры классов поместить в контейнер - нема квешнзов. Ну а std::set то где? Напомню что он определяется как
C++ (Qt)
std::set <MyClass *, MyFunctor> theSet;
Где MyFunctor - тип (а не экземпляр)
В продолжение идеи
V1KT0PC++ (Qt)
#include <set>
#include <vector>
#include <cassert>
class MyClass
{
};
class IFunctor
{
public:
virtual ~IFunctor(){}
virtual bool operator() (const MyClass* left, const MyClass* right) const =0;
};
class ConcreteFunctor1: public IFunctor
{
public:
virtual bool operator() (const MyClass* left, const MyClass* right) const
{
return false;
};
};
class ConcreteFunctor2: public IFunctor
{
public:
virtual bool operator() (const MyClass* left, const MyClass* right) const
{
return false;
};
};
class ProxyFunctor
{
public:
ProxyFunctor():funct_(0)
{
}
ProxyFunctor(IFunctor* functor):funct_(functor)
{
}
bool operator() (const MyClass* left, const MyClass* right) const
{
assert(funct_);
return (*funct_)(left, right);
};
private:
const IFunctor* funct_;
};
int main()
{
std::vector<std::set<MyClass*, ProxyFunctor> > vect;
vect.push_back( std::set<MyClass*, ProxyFunctor>(ProxyFunctor(new ConcreteFunctor1())));
vect.push_back( std::set<MyClass*, ProxyFunctor>(ProxyFunctor(new ConcreteFunctor2())));
return 0;
}
Идея понятна?