Сгенерировать имя функции

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Motoroller
Сообщения: 1
Зарегистрирован: 27 авг 2004, 11:30

Здравствуйте!
Эта проблема, наверное, решена не одним программистом.

Есть функции fun1(), fun2(),...,fun100();
Как сгенерировать название необходимой в данный момент функции.
Поясню.

for(int i=1; i<=100; i++)
{
"fun"+i - должно вызывать соответствующую fun, т.е.

"fun"+1 - преобразуется в "fun1" и вызывает fun1();
"fun"+2 - преобразуется в "fun2" и вызывает fun2(); и.т.д.
}

Естественно, напрямую это не сделать. Может, кто-нибудь подскажет вариант решения проблемы?
Это элементарно решается с помощью switch(), но функций - 100 штук, так что придется писать 100 case
Можно использовать массив(или вектор) указателей на функции, но и в этом случае придется эти 100 функций заносить туда вручную, т.е. array_fun[]={fun1, fun2,........fun100};

ПО-встроенное. Компилятор - Linux, без сторонних библиотек(типа boost и др.), только средствами C/C++.
И еще! Выбор функции должен происходить во время исполнения, поэтому макросы не годятся!!!
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Создаём массив функций и вызываем по индексу.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Выход один - только массив указателей на функции. По другому никак. В любом случае нужно иметь привязку к указателю на функцию для того, чтобы её вызвать. Сделать call по имени не возможно даже с логической точки зрения: в релизных экзышниках имена функций отсутствуют (есть только их адреса).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить