Можно ли создать / сгенерировать объявление указателя, похожее на:
void (*foo)(int, float);
bool (*foo)();
char (*foo)(char, int);
Но без знания типа аргументов или возвращаемого типа до времени выполнения.
Объявление функции будет считываться из строки, которая будет указывать тип возвращаемого значения и аргумента (если есть), а затем (если возможно) храниться в контейнере c ++.
Это можно сделать во время выполнения (не во время компиляции)? А также C ++ 11 может быть использован при необходимости.
Я действительно сомневаюсь, что это может быть сделано в статически типизированном языке, таком как C ++, но если это возможно, то какой подход кто-то использует. Нет необходимости в коде (но это ценится), только некоторые указания на то, что должно быть использовано.
РЕДАКТИРОВАТЬ:
После проверки нескольких идей выясняется, что это невозможно (напрямую) с помощью C ++. К счастью, я нашел dyncall библиотека, которая позволяет мне делать это (косвенно) и на довольно большом количестве платформ.
Пример функции:
double sqrt(double x);
Использование dyncall для вызова функции:
double r;
DCCallVM* vm = dcNewCallVM(4096);
dcMode(vm, DC_CALL_C_DEFAULT);
dcReset(vm);
dcArgDouble(vm, 4.2373);
r = dcCallDouble(vm, (DCpointer)&sqrt);
dcFree(vm);
Строки также могут быть использованы для объявления структуры функции.
C function prototype dyncall signature
void f1(); ")v"int f2(int, int); "ii)i"long long f3(void*); "p)L"void f3(int**); "p)v"double f4(int, bool, char, double, const char*); "iBcdZ)d"
Это зависит от того, сколько типов аргументов вы будете обрабатывать. Технически — вы можете делать все в C ++, просто иногда это не так просто, как хотелось бы.
Вы могли бы использовать образец делегата:
class baseDelegate(){};
template<typename retT, typename paramT>
class delegate: public baseDelegate{
public:
retT (*ptr)(paramtT);
};
vector<baseDelegate*> yourDelegateList;
Поскольку вы пометили тему как C++11
Вы также можете использовать std::function
, вариационные шаблоны и так далее, чтобы было проще. Приведенный выше код является лишь примером.
Вы могли бы сделать что-то вроде
void function (string &arg, …) ;
и использовать функцию переменных аргументов C ++.
Вам нужно хотя бы один фиксированный аргумент.
Как правило, то, что вы описываете, не очень хорошая вещь в C ++, как вы указываете.