在c++运行时生成函数指针声明
Generate function pointer declaration at run-time in 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"
这取决于您将处理多少类型的参数。从技术上讲——你可以用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++中并不是一件好事。
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针