C ++ 11 — генерировать объявление указателя функции во время выполнения в C ++?

Можно ли создать / сгенерировать объявление указателя, похожее на:

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"

0

Решение

Это зависит от того, сколько типов аргументов вы будете обрабатывать. Технически — вы можете делать все в C ++, просто иногда это не так просто, как хотелось бы.

Вы могли бы использовать образец делегата:

class baseDelegate(){};

template<typename retT, typename paramT>
class delegate: public baseDelegate{
public:
retT (*ptr)(paramtT);
};

vector<baseDelegate*> yourDelegateList;

Поскольку вы пометили тему как C++11Вы также можете использовать std::function, вариационные шаблоны и так далее, чтобы было проще. Приведенный выше код является лишь примером.

2

Другие решения

Вы могли бы сделать что-то вроде

void function (string &arg, …) ;

и использовать функцию переменных аргументов C ++.

Вам нужно хотя бы один фиксированный аргумент.

Как правило, то, что вы описываете, не очень хорошая вещь в C ++, как вы указываете.

0

По вопросам рекламы [email protected]