Вопрос по поводу стандартных функторов
От: Stas Chistyakov Россия  
Дата: 02.01.03 11:32
Оценка:
Люди, ситуация такая уменя есть класс CDocument в котором определено много простых функций вида CString GetName(), CString GetParam1(), CString Get........
Так же у меня есть vector<CDocument*> DocList. Мне необходимо постоянно производить поиск по раздичным критериям, типа одна из тех функций равна определенному значению. Хотелось бы сделать все стандартными функторами, но у меня не хватает фантазии как это написать, если кто может подсказать, то буду благодарен.
P.S. написать на каждую функцию по функтору или один шаблонный функтор не составляет проблемы, но по определенным мотивам хочется узнать можно ли это сделать стандартными функторам (можно предложить что-нибудь из библиотеки boost)
Re: Вопрос по поводу стандартных функторов
От: Bell Россия  
Дата: 02.01.03 14:19
Оценка: 6 (1)
Здравствуйте, Stas Chistyakov, Вы писали:


#include <vector>
#include<algorithm>
#include <boost/compose.hpp>
#include <boost/mem_fn.hpp>
using namespace std;
using namespace boost;

class CTest
{
   int _n1, _n2;
public:
   CTest(int n1, int n2) : _n1(n1), _n2(n2) {}
   int GetN1() { return _n1; }
   int GetN2() { return _n2; }
};

int main(int argc, char** argv)
{
   vector<CTest*> arr;
   arr.push_back(new CTest(1, 2));
   arr.push_back(new CTest(3, 4));

   //for(vector<CTest*>::iterator it = arr.begin(); it != arr.end();++it)
   //   if(compose_f_gx(bind2nd(equal_to<int>(), 1), mem_fn(&CTest::GetN1))(*it))
   //      break;

   
   vector<CTest*>::iterator it = find_if(arr.begin(), arr.end(), 
      compose_f_gx(bind2nd(equal_to<int>(), 3), mem_fn(&CTest::GetN1)));

   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: Вопрос по поводу стандартных функторов
От: MaximE Великобритания  
Дата: 02.01.03 17:58
Оценка: 9 (2)
Здравствуйте, Bell, Вы писали:

Не забываем включать хедер <functional>.

Если пользовать STLPort, то здесь можно обойтись и без boost'a:


   //vector<CTest*>::iterator it = find_if(arr.begin(), arr.end(), 
   //   compose_f_gx(bind2nd(equal_to<int>(), 3), mem_fn(&CTest::GetN1)));

   vector<CTest*>::iterator it = find_if(arr.begin(), arr.end(), 
      compose1(bind2nd(equal_to<int>(), 3), mem_fun(&CTest::GetN1)));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.