【发布时间】:2014-05-02 15:42:39
【问题描述】:
是否可以创建/生成类似于以下的指针声明:
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"
【问题讨论】:
-
据我所知,这是做不到的。
-
所以你有一个字符串。您将 something 存储在以某种方式从该字符串派生的容器中(它不能是声明 - 这是一个编译时概念;您将存储一些对象)。怎么办?这个练习的最终目标是什么?
-
为什么需要这样做?是否可以重新设计您的代码,这样您就不需要这样做了?
-
我需要能够为需要支持简单函数的小型脚本语言生成函数指针声明,以便与 AsmJit 一起使用。 AsmJit 可以将生成的代码分配给函数指针,然后可以从 c/c++ 调用。没有什么特别的,只会使用基本的 c++ 类型。没有物体或任何类似的东西。也许是指针,但除此之外没有其他东西可以用于参数。
-
没有。使函数接受 Variants 的容器(其中“Variant”是一个可以包含各种类型数据的对象)。
标签: c++ c++11 runtime function-declaration dyncall