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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> map и функции, как в контейнер записать функцию/процед 
:(
    Опции темы
GorbunovDiman
Дата 17.3.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.3.2008

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



Здраствуйте!
Можно ли в map записать указатель на функцию чтобы потом вызвать её по ключу?(Для каждого ключа своя функция)
Почему нужно именно в контейнер потому , что функции должны удалятся и добовляться динамически и в начале работы программы нельзя пердсказать что там и сколько будет. Если можно то  smile  
PM MAIL   Вверх
boostcoder
Дата 17.3.2011, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в значении, укажи тип - указатель на функцию.
PM WWW   Вверх
mes
Дата 17.3.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GorbunovDiman @  17.3.2011,  20:01 Найти цитируемый пост)
Для каждого ключа своя функция)

но сигнатура у всех одинаковая должна быть.. 



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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.3.2008

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



Цитата

но сигнатура у всех одинаковая должна быть.


да это так.
Цитата

в значении, укажи тип - указатель на функцию. 


Код

void test(){
...

};
int main(){
...
map<int,void(*)()> x;
x.insert(pair<int,void(*)()>(1,test));
...
};



Этот код скомпилировался.что касается void(*)() , то такая комбинация скобок была получена экспериментально(другие варианты выводили ошибку на стадии insert).
Вопрос:
1)как вызвать функцию по ключу на выполнение?
2)я так понимаю в контейнер записывается экземпляр функции, а не указатель! как записать указатель?

 smile  smile  smile 
PM MAIL   Вверх
boostcoder
Дата 18.3.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Код

#include <map>
#include <iostream>

typedef void(*function_signature)();
typedef std::map<int, function_signature> function_map;

void func1() {
   std::cout << "func1()" << std::endl;
}
void func2() {
   std::cout << "func2()" << std::endl;
}
void func3() {
   std::cout << "func3()" << std::endl;
}

int main() {
   function_map map;
   map[1] = &func1;
   map[2] = &func2;
   map[3] = &func3;
   
   for ( auto iter = map.begin(); iter != map.end(); ++iter ) {
      iter->second();
   }
}


http://liveworkspace.org/code/888311a365bc...3f7903dc534ca9b
PM WWW   Вверх
mes
Дата 18.3.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GorbunovDiman @  18.3.2011,  15:53 Найти цитируемый пост)
экземпляр функции, а не указатель! как записать указатель?

указатель.. для наглядности можете писать так :
Код

typedef void fn_t();
std::map<std::string, fn_t*> _map;


Цитата(GorbunovDiman @  18.3.2011,  15:53 Найти цитируемый пост)
1)как вызвать функцию по ключу на выполнение?

вот пример:
http://liveworkspace.org/code/5459aa62e56d...340b6740c26eb96

Добавлено через 1 минуту и 34 секунды
теперь даже два примера - выбирайте на вкус..

Добавлено через 2 минуты и 46 секунд
вариант с итератором  (у boostcoder) эффективнее, но для начинающих трудноват для понимания.. 




--------------------
PM MAIL WWW   Вверх
GorbunovDiman
Дата 18.3.2011, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.3.2008

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



Всем огромное спасибо за примеры!

А можно объяснить именно эту строку?

Код

typedef void(*function_signature)();


А можно ли вызвать на выполнение только одну функцию и как это грамотно сделать?
Вариант с итераторами очень нагляден,НО мне нужно вызывать не все ,а только одну!
Правильным ли будет код
Код

map[3]();


Добавлено через 2 минуты и 55 секунд
Цитата

Код

map[3]();



Вопрос отпал сам собой!Работает.
PM MAIL   Вверх
mes
Дата 18.3.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GorbunovDiman @  18.3.2011,  18:30 Найти цитируемый пост)
А можно объяснить именно эту строку?
typedef void(*function_signature)();

Код

typedef void(*pfn)();
эквивалентно :
typedef void fn();
typedef fn*  pfn;




Это сообщение отредактировал(а) mes - 18.3.2011, 23:39


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

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

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

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

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


 




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


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

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