Есть много функций с одинаковым именем и разной цифрой в конце этого имени, то есть function1, function2, function3 и т.д. То есть, в определенном месте программы у меня есть счетчик, по которому я вызываю уже нужную из этих функцию, но как-то не хочется это делать через if или switch. Так вот, если сложить вместе имя функции function и счетчик, то можно ли как-то вызвать по этому имени функцию?
Если вам хочется такого, вы скорее всего неправильно построили архитектуру своей программы. Трюки, которые проходят в PHP или Javascript'е, не нужны в жёстко типизированных языках, в них другие выразительные средства.
Если всё же вам непременно хочется идти этим путём, заведите массив или карту.
Пример:
typedef double (*function_t)(double);
function_t[] functions =
{
function0,
function1,
function2,
function3,
function4
};
unsigned int number_of_functions = sizeof(functions) / sizeof(functions[0]);
double call_by_index(unsigned int index, double argument)
{
if (index >= number_of_functions)
{
// сообщите об ошибке, например, можете выбросить исключение
// или вернуть NaN
}
return functions[index](argument);
}
Но, повторюсь, это неправильный путь. Если вы расскажете, что именно вы хотите запрограммировать, возможно, мы подскажем дизайн получше.
Можно.
Почитайте о разделяемых библиотеках (.so), посмотрите man dlopen
(в винде тоже есть что-то похожее, свое, см. в сторону .dll).
Вот "для затравки" совсем небольшой ленивый примерчик:
avp@avp-xub11:lib$ cat t1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int
main (int ac, char *av[])
{
if (ac <= 0 || ac > 100) { // а это кривая проверка "самовызова"
printf("self-call: %s\n", (char *)ac);
return 0;
}
void *my = dlopen(0, RTLD_NOW);
if (!my) {
printf("dlopen: %s\n", dlerror());
exit(1);
}
int i;
for (i = 1; av[i]; i++) {
void (*f)() = dlsym(my, av[i]);
if (!f)
printf("function [%s] not found\n", av[i]);
else
f(av[i]), puts("");
}
return puts("End") == EOF;
}
avp@avp-xub11:lib$ gcc t1.c -ldl -rdynamic
avp@avp-xub11:lib$ ./a.out f1 puts printf main
function [f1] not found
puts
printf
self-call: main
End
avp@avp-xub11:lib$
Программа открывает саму себя (загрузочный модуль) как разделяемую библиотеку, а также наследует уже подключенные загрузчиком другие .so и вызывает функции, имена которых передаются в аргументах main()
.
Только учтите, правильность передачи параметров никто не проверяет. Вы должны знать, какие параметры принимает функция и обязаны сами вызывать ее правильно.
Можете посмотреть библиотеку, в которой есть функция eval(), где-то видел такое, гугл ничего не дает, но я видел. Но если вы делаете серьезный проект, то лучше этого избежать, eval в любом языке - опасная функция, ее принцип основывается на передаче туда строки с кодом, его выполнении и получении какого-то объекта, любого возможного в пределах языка.
Либо еще есть механизм каррирования, гуглите.
Не знаю правильно ли я назвал вопрос, но ситуация такаяЕсть класс Parent:
Есть имя файла, переведенное в QByteArrayЕсть содержимое файла в QByteArray