Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> bind, (как это сделать) 
:(
    Опции темы
np9mi7
  Дата 1.4.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день!

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


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: написание функции/функтора не предлагать;


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Void
Дата 1.4.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Код

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

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
np9mi7
  Дата 2.4.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



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?

Это сообщение отредактировал(а) np9mi7 - 2.4.2006, 14:12


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Void
Дата 2.4.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
np9mi7
  Дата 12.6.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
Скорее глюки Борланда.
, это глюки которые предусмотрены стандартом (Ссылка на ссылку); 


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
MAKCim
Дата 12.6.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ну сделай свой функтор
Код

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Earnest
Дата 12.6.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.