Я не могу создать указатель на функцию, которая возвращает unique_ptr - PullRequest
0 голосов
/ 28 февраля 2019

Я хотел бы вызвать функцию из динамической библиотеки во время выполнения.Эта функция возвращает указатель на динамически размещенный объект (я упростил приведенный ниже код до целого).
Я бы хотел, чтобы приведенный ниже код сохранял этот указатель на этот объект, чтобы использовать этот объект по своему усмотрению.

#include <dlfcn.h>
#include <memory>

/* myFunction() is supposed to be in my dynamic library */
std::unique_ptr<int> myFunction()
{
    return std::unique_ptr<int>(new(int));
}

int main(int argc, char *argv[])
{
    int *(*functionPtr)() = nullptr;

    void *handle = dlopen(argv[1], RTLD_NOW);
    int *symbolAddress = static_cast<int *>(dlsym(handle, "myFunction"));

    *(int **)(&functionPtr) = symbolAddress;

    int *x = functionPtr();
    //std::unique_ptr<int> x = functionPtr();

    return 0;
}

Приведенный выше код компилируется, но я написал, что возвращаемым типом функции myFunction является "int *" (в основной функции), чего нет в объявлении функции в моей библиотеке.

PS: В этом посте я называю «object» для упрощения, например, тип int.
Моя конечная цель - раскомментировать последнюю строку.

Iможет делать не то.Я все еще изучаю язык, но я хотел бы правильно написать код, поэтому я открыт для реструктуризации своего кода.

1 Ответ

0 голосов
/ 28 февраля 2019

Тип myFunction равен std::unique_ptr<int> ().Таким образом, тип указателя на myFunction равен std::unique_ptr<int> (*)().Именно так должно быть объявлено functionPtr:

std::unique_ptr<int> (*functionPtr)();

Дополнительно:

*(int **)(&functionPtr) = symbolAddress;

Этот тип записи типа с нарушением правил нарушает строгиепсевдонимы в C и C ++, и я не уверен, почему symbolAddress это int * для начала.Ваш код должен выглядеть примерно так:

void *symbolAddress = dlsym(handle, "myFunction");
functionPtr = (std::unique_ptr<int>(*)())symbolAddress;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...