除了boost(Bind& Function)之外,如何在C ++中动态调用函数?
PHP有:
$obj = new MyObject();
$function = 'doSomething';
$obj->$function();
Objective-C有:
MyObject *obj = [[MyObject alloc] init];
SEL function = NSSelectorFromString(@"doSomething");
[obj performSelector: function];
答案 0 :(得分:8)
您可以导出必要的功能(例如通过使用__dllexport标记它们)并使用GetProcAddress或dlsym(取决于您的平台)来获取其地址:
void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY);
FunctionType *fptr = (FunctionType *)dlsym(handle, "doSomething");
fptr();
HANDLE handle = GetCurrentProcess();
FunctionType *fptr = (FunctionType *)GetProcAddress(handle, "doSomething");
fptr();
所有这些都是特定于平台的,并且在C ++中没有标准的方法来执行此操作。
答案 1 :(得分:3)
如果您感兴趣的那些函数属于同一类型,则可以创建字符串和函数指针的映射。
答案 2 :(得分:3)
如果我理解你的问题, 你可以在C ++中使用函数指针(或指向成员的指针)。您可以动态地决定调用哪个函数(可能需要相同的原型)并动态调用它。看到这个链接
答案 3 :(得分:2)
简单的答案是,你做不到。 C ++不会按名称查找方法。
答案 4 :(得分:2)
扩展Konstantin Oznobihin对问题的回答,你可以在声明中用extern“C”标记你引用的c ++函数,以防止编译器在编译期间破坏名称。
extern "C" void hello() {
std::cout << "Hello\n";
}
这将允许您通过最初给出的名称调用对象/函数。在这种情况下,它是'你好'。
void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY);
FunctionType *fptr = (FunctionType *)dlsym(handle, "hello");
fptr();
外部有一些东西“C”在引擎盖下,所以这里有一个简短的列表: In C++ source, what is the effect of extern "C"?