Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамическое формирование имени функции Такое возможно в С++?

9.4K
26 марта 2008 года
1_Aposym_1
68 / / 01.11.2007
Всем привет кому и интересно и есть что написать. Стало интересно можно ли создать функцию динамически ну вроде того “Func”+I и выходит функция с именем FuncI(). Понятное дело FuncI() выше описана. Если возможно такое то пример приведите малюсенький.
240
26 марта 2008 года
aks
2.5K / / 14.07.2006
Ну с помощью директив препроцессора. )
87
27 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: 1_Aposym_1
Стало интересно можно ли создать функцию динамически ну вроде того “Func”+I и выходит функция с именем FuncI().



Думал я, думал где это может пригодиться и пока придумал, что только в циклах типа for. Если так, то можно обойтись массивом указателей на функции. Что-то типа того:

Код:
#include <iostream>

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)();
}


Недостаток такого метода - приходится заранее прописывать указатели функций, зато можно использовать функции с непохожими именами.
9.4K
27 марта 2008 года
1_Aposym_1
68 / / 01.11.2007
kogrom, я тоже о таком способе подумывал
aks ты имеешь ввиду использовать директивы #if #else #endif. или что то другое.
3
27 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: 1_Aposym_1
Всем привет кому и интересно и есть что написать. Стало интересно можно ли создать функцию динамически ну вроде того “Func”+I и выходит функция с именем FuncI(). Понятное дело FuncI() выше описана. Если возможно такое то пример приведите малюсенький.


Ну это же не создание функции.
Динамическое создание функции, как например в JavaScript, Python, SmallTalk, на C++ не возможна, есть только жалкое подобие типа boost::lambda.

А то, что ты имеешь в виду (вызов функции по сгенерированному имени), действительно, не нужно в программах, написанных на C/C++.

6.6K
27 марта 2008 года
Ordos
105 / / 02.11.2007
Нет, такое не возможно.
Вообще если возникает подобное желание, то сразу нужно себе сказать: "Стоп, какого хрена я занимаюсь подобной фигнёй?" и остановиться! :о)
Названия функций и переменных существуют только на этапе компиляции. Во время выполнения есть только адреса в памяти.
В принципе в С# (а значит и в управляемом С++) есть такое понятие как рефлексия и там можно вызывать методы классов по имени, но это используется для динамического подключения сборок. То, что ты хочешь (в цикле вызывать функции) бесполезное занятие, 100% что задачу можно решить другим способом.
9.4K
27 марта 2008 года
1_Aposym_1
68 / / 01.11.2007
Ordos это всеголиш был вопрос. Я понимаю что ты мне написал, но я думал что существуют какие то механизмы для динамическго формирования имени функции и вызова ее. Но если ее нет: то какого хрена я занимаюсь подобной фигнёй 8). Воспользуюсь указателем на функцию.
2
27 марта 2008 года
squirL
5.6K / / 13.08.2003
Цитата: Ordos
Нет, такое не возможно.
Вообще если возникает подобное желание, то сразу нужно себе сказать: "Стоп, какого хрена я занимаюсь подобной фигнёй?"


ну зачем так категорично?
это не фигня, а иногда вполне удобно и применимо

502
27 марта 2008 года
Jail
550 / / 30.01.2007
[QUOTE=squirL] это не фигня, а иногда вполне удобно и применимо[/QUOTE]
Применимо, но только в языках с динамической типизацией. Green об этом уже сказал. Python, SmallTalk, и т.д.....
6.6K
27 марта 2008 года
Ordos
105 / / 02.11.2007
Цитата:
ну зачем так категорично?
это не фигня, а иногда вполне удобно и применимо



Просто очень часто люди задаются вопросами сходного характера: как во время выполнения скажем, обойти несколько переменных типа х_<а тут какая-нибудь циферка>, или как сформировав строку скажем { return 10; } присвоить её функции, чтобы её можно было вызвать... Я сам, когда начинал изучать, тогда ещё, паскаль думал "А как же такое сделать". Поскольку вопрос был именно о С++, то ответ один, никак. В JavaScript`е такое вполне возможно, но в С++ нужно искать другие решения, пообные врят-ли будут хорошим стилем программирования.

17K
03 апреля 2008 года
HookEst
144 / / 27.03.2008
Ну не так уж это и бесполезно, вызов(а не создание) функции по строковому имени может пригодится например при отладке, мало того это уже давно существует и широко используется в Automation в интерфейсе IDispatch.
Два метода: GetIDsOfNames - возвращает ID для метода с заданныи именем, и Invoke - собственно вызывает метод по этому ID.
Можно все это реализовать в один вызов, если нам не нужен ID.
Просто создать какой-нибудь map, в котором увязать все доступные имена функций с указателями на них, и запускать их оттуда, по мере надобности. А самый простой способ использовать if...elseif...elseif...
например:
Код:
#include "stdafx.h"

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;
}
3
03 апреля 2008 года
Green
4.8K / / 20.01.2000
... а ещё можно вспомнить GetProcAddress...
Но это все из другой оперы.
В рамках одного модуля, такое не нужно в 99,9% случаев.
Есть хоть один вменяемый пример необходимости такого?
Отладка? А зачем это в отладке?
17K
04 апреля 2008 года
HookEst
144 / / 27.03.2008
в одном модуле это не нужно 100%
87
04 апреля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Есть хоть один вменяемый пример необходимости такого?



Например, это может пригодиться, если вы создаёте программу, которая читает файл с простым пользовательским скриптом и исполняет его. Но тут, как уже сказал HookEst лучше "создать какой-нибудь map, в котором увязать все доступные имена функций с указателями на них".

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог