Динамическое формирование имени функции Такое возможно в С++?
Думал я, думал где это может пригодиться и пока придумал, что только в циклах типа for. Если так, то можно обойтись массивом указателей на функции. Что-то типа того:
using namespace std;
int Func0()
{
cout << "Func0" << endl;
return 0;
}
int Func1()
{
cout << "Func1" << endl;
return 0;
}
int main()
{
int (*Func[2])();
Func[0] = &Func0;
Func[1] = &Func1;
for(int i = 0; i < 2; i++)
(*Func)();
}
Недостаток такого метода - приходится заранее прописывать указатели функций, зато можно использовать функции с непохожими именами.
aks ты имеешь ввиду использовать директивы #if #else #endif. или что то другое.
Ну это же не создание функции.
Динамическое создание функции, как например в JavaScript, Python, SmallTalk, на C++ не возможна, есть только жалкое подобие типа boost::lambda.
А то, что ты имеешь в виду (вызов функции по сгенерированному имени), действительно, не нужно в программах, написанных на C/C++.
Вообще если возникает подобное желание, то сразу нужно себе сказать: "Стоп, какого хрена я занимаюсь подобной фигнёй?" и остановиться! :о)
Названия функций и переменных существуют только на этапе компиляции. Во время выполнения есть только адреса в памяти.
В принципе в С# (а значит и в управляемом С++) есть такое понятие как рефлексия и там можно вызывать методы классов по имени, но это используется для динамического подключения сборок. То, что ты хочешь (в цикле вызывать функции) бесполезное занятие, 100% что задачу можно решить другим способом.
Вообще если возникает подобное желание, то сразу нужно себе сказать: "Стоп, какого хрена я занимаюсь подобной фигнёй?"
ну зачем так категорично?
это не фигня, а иногда вполне удобно и применимо
Применимо, но только в языках с динамической типизацией. Green об этом уже сказал. Python, SmallTalk, и т.д.....
это не фигня, а иногда вполне удобно и применимо
Просто очень часто люди задаются вопросами сходного характера: как во время выполнения скажем, обойти несколько переменных типа х_<а тут какая-нибудь циферка>, или как сформировав строку скажем { return 10; } присвоить её функции, чтобы её можно было вызвать... Я сам, когда начинал изучать, тогда ещё, паскаль думал "А как же такое сделать". Поскольку вопрос был именно о С++, то ответ один, никак. В JavaScript`е такое вполне возможно, но в С++ нужно искать другие решения, пообные врят-ли будут хорошим стилем программирования.
Два метода: GetIDsOfNames - возвращает ID для метода с заданныи именем, и Invoke - собственно вызывает метод по этому ID.
Можно все это реализовать в один вызов, если нам не нужен ID.
Просто создать какой-нибудь map, в котором увязать все доступные имена функций с указателями на них, и запускать их оттуда, по мере надобности. А самый простой способ использовать if...elseif...elseif...
например:
int foo1(){return 10;}
int foo2(){return 20;}
int foo3(){return 30;}
int call(const char *fname){
if(!strcmp("foo1",fname))
return foo1();
if(!strcmp("foo2",fname))
return foo2();
if(!strcmp("foo3",fname))
return foo3();
}
int _tmain(int argc, _TCHAR* argv[])
{
char s[10];
for(int i=1;i<=3;i++){
sprintf(s,"foo%d",i);
printf("call of function %s returns %d\n\n",s,call(s));
};
getchar();
return 0;
}
Но это все из другой оперы.
В рамках одного модуля, такое не нужно в 99,9% случаев.
Есть хоть один вменяемый пример необходимости такого?
Отладка? А зачем это в отладке?
Например, это может пригодиться, если вы создаёте программу, которая читает файл с простым пользовательским скриптом и исполняет его. Но тут, как уже сказал HookEst лучше "создать какой-нибудь map, в котором увязать все доступные имена функций с указателями на них".