Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

bind + map - C++

14.01.2014, 12:15. Просмотров 378. Ответов 6
Метки нет (Все метки)

Вопрос, почему это не работает? Вроде же все правильно вызывается.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
   using map_t = std::map<std::string, int>;
   map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
 
   auto f = std::bind(&map_t::find, &map, std::placeholders::_1);
   f("A");
 
   return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
14.01.2014, 12:56     bind + map #2
DiffEreD, потому что метод find перегружен, bind не будет выбирать одну из перегрузок сам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <map>
#include <functional>
 
 
int main()
{
   using map_t = std::map<std::string, int>;
   map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
 
   using map_find_t = map_t::const_iterator (map_t::*)(map_t::key_type const&) const;
 
   auto f = std::bind(static_cast<map_find_t>(&map_t::find), &map, std::placeholders::_1);
   f("A");
 
   return 0;
}
http://ideone.com/aAv1py
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.01.2014, 13:09  [ТС]     bind + map #3
Ну и дела.
А как понять эту запись (map_t::*), - это типа указатель на безимянную ф-цию?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.01.2014, 13:27     bind + map #4
DiffEreD, Указатель на член класса.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
14.01.2014, 13:34     bind + map #5
DiffEreD, можешь написать функтор с нужными перегрузками operator () для поиска в мапе, если так не охота с кастами возиться.
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.01.2014, 13:58  [ТС]     bind + map #6
gray_fox, идею понял так:
C++
1
2
3
4
5
struct map_find_t
{
   map_t::const_iterator operator ()(map_t::key_type const&) const;
   map_t::iterator operator ()(map_t::key_type const&);
};
Но как это потом вызывать в bind?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 14:24     bind + map
Еще ссылки по теме:

C++ Проверить объект в std::bind на живучесть
Bind (Soket) - ошибка при компиляции после подключения boost C++
C++ Разобраться с std::bind, плейсхолдеры
Адаптер функции bind() C++
Bind с инициализацией указателя "на месте" C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
14.01.2014, 14:24     bind + map #7
DiffEreD, я думал о таком:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
#include <map>
#include <functional>
     
     
struct assoc_find_type {
     
   template<typename AssocContainer>
   typename AssocContainer::iterator
   operator ()(AssocContainer & container, typename AssocContainer::key_type const& key) const {
      return container.find(key);
   }
     
   template<typename AssocContainer>
   typename AssocContainer::const_iterator
   operator ()(AssocContainer const& container, typename AssocContainer::key_type const& key) const {
      return container.find(key);
   }
};
     
constexpr assoc_find_type assoc_find;
     
     
int main()
{
    using map_t = std::map<std::string, int>;
    map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
     
    auto f = std::bind(assoc_find, std::ref(map), std::placeholders::_1);
    f("A")->second = 42;
     
    auto u = std::bind(assoc_find, std::cref(map), std::placeholders::_1);
    std::cout << u("A")->second << std::endl;
     
    return 0;
}
http://ideone.com/mM7yDg

Добавлено через 20 минут

Не по теме:

можно ещё и такое замутить: http://ideone.com/Y2m0cO чего только в голову не взбредёт

Yandex
Объявления
14.01.2014, 14:24     bind + map
Ответ Создать тему
Опции темы

Текущее время: 07:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru