как динамически вызвать функцию в C++
кроме boost (Bind & Function), как я могу динамически вызывать функцию на C++?
в PHP:
$obj = new MyObject();
$function = 'doSomething';
$obj->$function();
цель-C имеет:
MyObject *obj = [[MyObject alloc] init];
SEL function = NSSelectorFromString(@"doSomething");
[obj performSelector: function];
5 ответов
вы можете экспортировать необходимые функции (e.g пометив их _ _ 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++ для этого.
Если я правильно понял ваш вопрос, вы можете использовать указатель функции (или указатель на элемент) в C++. Вы можете динамически решить, какую функцию вызвать (вам может понадобиться прототип того же самого) и вызвать ее динамически. См. эту ссылку
расширяя ответ Константина Ознобихина на вопрос, вы можете отметить функции C++, на которые вы ссылаетесь с extern "C" в объявлении, чтобы предотвратить компилятор от искажения имен во время компиляции.
extern "C" void hello() {
std::cout << "Hello\n";
}
Это позволит вам вызвать ваш объект/функцию по имени, которое изначально дал ему. В данном случае это "привет".
void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY);
FunctionType *fptr = (FunctionType *)dlsym(handle, "hello");
fptr();
есть куча вещей, которые extern " C " делает под капотом, поэтому вот короткий список: в источнике C++ , каков эффект extern "C"?