1

boost::function生の関数ポインタでオブジェクト を初期化するにはどうすればよいですか?

メタコード

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

..。

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

Library* libInstance = functionObj();

追加情報が必要な場合は、私に知らせてください。

4

2 に答える 2

1

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();
于 2011-12-02T15:42:13.740 に答える
0

boost::bind を使用すると、文字通り関数をブースト関数オブジェクトにバインドできます。

boost::function</*proper function pointer type*/> functionObj = boost::bind(functionPtr); 
于 2011-12-02T15:40:40.213 に答える