Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > bind


Автор: np9mi7 1.4.2006, 23:20
Добрый день!

Имеется код:
Код


class some_abstract
{
public:
         virtual void action () = 0;
         virtual ~some_abstract (){}
};

class some : public some_abstract
{
public:
         virtual void action (){}
         virtual ~some (){}
};

typedef std::map <std::string, boost::shared_ptr <some_abstract> > map_def;

void f (map_def & ref)
{

     std::for_each (ref.begin (), ref.end (), /* хочу вызвать action для всех second values в парах */);

};



Проблема в том что в std::map лежат std::pair <std::string, boost::shared_ptr <some_abstract> > и мне нужно вызвать метод pair.second;

Как это сделать?

Заранее благодарен за ответы.

ps: написание функции/функтора не предлагать;

Автор: Void 1.4.2006, 23:59
Код

std::for_each (ref.begin(), ref.end(),
    boost::bind(&some_abstract::action, boost::bind(&map_def::value_type::second, _1)));

Раз уж все равно Boost используешь.

Автор: np9mi7 2.4.2006, 14:06
Void, всё круто, но вот такой "прекрасный" компилятор как Borlan Builder C++ 6.0 + update 4 выдает следующую ошибку:
Цитата

E2285 Could not find a match for '_mfi::mf0<void,some_abstract>::operator ()(shared_ptr<some_abstract>)'

и в исходник Boost - а:
Код

    template<class F, class A> void operator()(type<void>, F & f, A & a, int)
    {
        unwrap(&f, 0)(a[a1_]);
    }
, причем и Borland Builder C++ 10 тоже не может это компилировать, падает на том же месте. А MSVC все понимает (только я на 8.0 смотрел);

Не доработка Boost - a?

Автор: Void 2.4.2006, 17:48
Цитата(np9mi7 @ 2.4.2006, 16:06 Найти цитируемый пост)
Не доработка Boost - a?

Скорее глюки Борланда. Я бы вообще поостерегся с ним писать такие комбинаторы. Лучше потратить чуть больше строчек на свой функтор или цикл, чем разгребать странные ошибки и ICE.

Автор: np9mi7 12.6.2006, 01:24
Цитата
Скорее глюки Борланда.
, это глюки которые предусмотрены стандартом (http://rsdn.ru/Forum/Message.aspx?mid=1826092&only=1); 

Автор: MAKCim 12.6.2006, 09:59
ну сделай свой функтор
Код

class functor
{
private:
    void operator()(std::pair<std::string, boost::shared_ptr<some_abstract> >& obj)
        {obj.second->action();}
};
 

Автор: Earnest 12.6.2006, 11:53
Или можно сделать спец. функторы общего назначения для извлечение первого и второго элемента пары - чтобы использовать их вместе c boost::bind. 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)