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

bind + map - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.01.2014, 12:15     bind + map #1
Вопрос, почему это не работает? Вроде же все правильно вызывается.
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 12:15     bind + map
Посмотрите здесь:

std::bind C++
C++ Где применяется bind
Bind + string::front C++
C++ Как вставить map в map
Приведение map<int, B> к map<int, A> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.01.2014, 13:09  [ТС]     bind + map #3
Ну и дела.
А как понять эту запись (map_t::*), - это типа указатель на безимянную ф-цию?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2014, 13:27     bind + map #4
DiffEreD, Указатель на член класса.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.01.2014, 13:34     bind + map #5
DiffEreD, можешь написать функтор с нужными перегрузками operator () для поиска в мапе, если так не охота с кастами возиться.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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++ Перегруженные функции и bind
C++ Проверить объект в std::bind на живучесть
C++ Разобраться с std::bind, плейсхолдеры

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
Ответ Создать тему
Опции темы

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