在C ++中运行时生成函数指针声明?

时间:2014-03-25 01:18:21

标签: c++ c++11 runtime function-declaration dyncall

是否可以创建/生成类似于:

的指针声明
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"

2 个答案:

答案 0 :(得分:2)

这取决于您将处理多少种类型的参数。从技术上讲 - 你可以用C ++做所有事情,有时它并不像你想要的那么简单。

您可以使用委托模式

class baseDelegate(){};

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

vector<baseDelegate*> yourDelegateList;

由于您已将主题标记为C++11,因此您还可以使用std::function可变参数模板等,以简化主题。上面的代码只是一个例子。

答案 1 :(得分:0)

你可以做类似

的事情
void function (string &arg, …) ;

并使用C ++的变量参数功能。

你需要至少一个固定的论点。

通常,您所描述的内容在C ++中并不是一件好事,正如您所指出的那样。