как динамически вызвать функцию в 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++. Вы можете динамически решить, какую функцию вызвать (вам может понадобиться прототип того же самого) и вызвать ее динамически. См. эту ссылку

https://isocpp.org/wiki/faq/pointers-to-members


простой ответ: вы не можете. 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"?