Привязать указатель функции к объекту boost :: function - PullRequest
1 голос
/ 02 декабря 2011

Как я могу инициализировать boost::function объект с необработанным указателем на функцию?

Metacode

extern "C"
{
    class Library
    {
        ...
    };
    Library* createLibrary();
}

...

void* functionPtr = library.GetFunction("createLibrary");
boost::function<Library*()> functionObj(functionPtr);

Library* libInstance = functionObj();

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

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

void* не является указателем на функцию, поэтому вы не можете создать boost::function из него. Вы, вероятно, хотите сначала преобразовать это в правильный указатель на функцию. Как это сделать зависит от реализации.

Вот как это уродливое преобразование рекомендуется в POSIX ( обоснование ):

void* ptr = /* get it from somewhere */;
Library* (*realFunctionPointer)(); // declare a function pointer variable
*(void **) (&realFunctionPointer) = ptr // hack a void* into that variable

Ваша платформа может требовать различных махинаций.

Если у вас есть такой указатель, вы можете просто сделать:

boost::function<Library*()> functionObj(realFunctionPtr);

Library* libInstance = functionObj();
0 голосов
/ 02 декабря 2011

с помощью boost :: bind вы можете буквально привязать функции к объекту функции boost.

boost::function</*proper function pointer type*/> functionObj = boost::bind(functionPtr); 
...