#cpp
В PHP существует такая фича: $func_name = 'print' $func_name('test') Можно ли осуществить подобное в C++?
Ответы
Ответ 1
Да есть такое и в С++, есть указатели на функции, смотрите код: #includeusing namespace std; int example(const int a, const int b){ return a * b; } typedef // создаем новый прототип (в данном случае указатель на функцию) int // возвращаемое значение (такое же как в функциях) (*func) // имя прототипа (в коде употребляется без звездочки) (const int, const int); // список параметров (такое же как в функциях) int main(){ func test = example; cout << test(3, 2) << endl; return 0; } результат: Ответ 2
Вот пример для Linux, как можно искать и вызывать функции по имени (все подробности в man dlopen и SEE ALSO там) #include#include #include #include #include // Defines LIBM_SO (which will be a string such as "libm.so.6") #ifdef __cplusplus extern "C" { #endif double drand () { return (double)rand(); } double drand2 (double a) { return ((double)rand() / RAND_MAX) * a; } #ifdef __cplusplus } #endif int main (int ac, char *av[]) { void *hmain = dlopen(0, RTLD_LAZY), *hmath = dlopen(LIBM_SO, RTLD_LAZY); if (!hmain) exit((fprintf(stderr, "dlopen(main): %s\n", dlerror()), 1)); if (!hmath) fprintf(stderr, "dlopen(%s): %s\n", LIBM_SO, dlerror()); char fname[101]; double a; int rc; while ((rc = scanf("%100s %lf", fname, &a)) != EOF) { if (rc == 2) { double (*f)(double) = (__typeof__(f))dlsym(hmain, fname); if (!f && hmath) f = (__typeof__(f))dlsym(hmath, fname); if (f) printf("%s(%f) = %f\n", fname, a, f(a)); else fprintf(stderr, "dlsym(%s): %s\n", fname, dlerror()); } else fputs("Invalid input, try again or finish by ^D\n", stderr); } return puts("End") == EOF; } Условная компиляция, включающая extern "C" { нужна для того, чтобы имена функций при использовании крестового (С++, g++) компилятора можно было вводить в том же виде, как Вы их пишете (а не что-то вроде _Z5drandv и _Z6drand2d). Проверял в gcc и g++. Компилировать нужно с флагами -ldl (для подключения библиотеки непосредственно с dlopen(), dlsym() и т.д.) и -rdynamic для того, чтобы имена функций определенных в самом модуле (здесь в файле с main()), стали доступны dlsym. Т.е. gcc fncall.c -ldl -rdynamic -Wall или g++ fncall.c -ldl -rdynamic -Wall
Комментариев нет:
Отправить комментарий