Как динамически вызывать функцию в C ++ - PullRequest
11 голосов
/ 19 января 2012

Как кроме 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];

Ответы [ 5 ]

8 голосов
/ 19 января 2012

Вы можете экспортировать необходимые функции (например, пометив их с помощью __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 ++.

3 голосов
/ 19 января 2012

Если я правильно понял ваш вопрос, вы можете использовать указатель на функцию (или указатель на член) в C ++.Вы можете динамически решить, какой вызов функции (вам может понадобиться один и тот же прототип), и вызывать его динамически.Смотрите эту ссылку

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

3 голосов
/ 19 января 2012

Если интересующие вас функции относятся к одному типу, вы можете создать карту строк и указателей на функции.

2 голосов
/ 25 августа 2013

Расширяя ответ Константина Ознобихина на вопрос, вы можете пометить функции c ++, на которые вы ссылаетесь, с помощью extern «C» в объявлении, чтобы компилятор не искажал имена во время компиляции.

extern "C" void hello() {
    std::cout << "Hello\n";
}

Thisпозволит вам вызывать ваш объект / функцию по имени, которое вы ему изначально дали.В данном случае это 'hello'.

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY);
FunctionType *fptr = (FunctionType *)dlsym(handle, "hello");
fptr();

Есть куча вещей, которые extern "C" делает под капотом, поэтому вот короткий список: В источнике C ++, каков эффектвнешнего "C"?

2 голосов
/ 19 января 2012

Простой ответ: нельзя.C ++ не делает поиск метода по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...