Russian Qt Forum
Сентябрь 30, 2024, 18:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Массив std::set  (Прочитано 9942 раз)
DmitryM
Гость
« Ответ #15 : Сентябрь 18, 2012, 16:22 »

Вот сразу два варианта:
1) Путем наследования от интерфейса, это если можно править классы функторов.
2) Путем шаблонного наследования от интерфеса, это если нельзя править классы функторов.
Все функторы в моих руках и, как обычно, они очень просты. Приведенный Вами код понятен - да, можно сделать функторам общую базу, а можно и обернуть. Указатели на созданные экземпляры классов поместить в контейнер - нема квешнзов. Ну а std::set то где? Напомню что он определяется как
Код
C++ (Qt)
std::set <MyClass *, MyFunctor> theSet;
 
Где MyFunctor - тип (а не экземпляр)
В продолжение идеи  V1KT0P

Код
C++ (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;
}
 
Идея понятна?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Сентябрь 18, 2012, 17:32 »

Во блин, тут же все просто, чего я ломился в открытую дверь? Улыбающийся Есть же возможность передать функтор в конструторе

Код
C++ (Qt)
#include <set>
#include <vector>
 
bool Compare1( int v0, int v1 ) { return v0 < v1; }
bool Compare2( int v0, int v1 ) { return v0 > v1; }
 
typedef bool (*func) (int, int);
 
int main()
{
typedef std::set <int, func> TSet;
std::vector <TSet *> vec;
 
vec.push_back(new TSet(Compare1));
vec.push_back(new TSet(Compare2));
 
for (int i = 0; i < 4; ++i) {
vec[0]->insert(i);
vec[1]->insert(i);
}
 
for (size_t i = 0; i < vec.size(); ++i) {
printf("[%ld]: ", i);
for (TSet::iterator it = vec[i]->begin(); it != vec[i]->end(); ++it)
printf("%d, ", *it);
printf("\n");
}
 
return 0;
}
 
Ну ничего, подучил матчасть  Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.249 секунд. Запросов: 22.