2017-11-26 17 views
0

私は独自のファイルを開くために第三者のライブラリを使用するC++アプリケーションを作成しています。私のアプリケーションでは、ユーザーは次のようなことをすることができます:関数ポインタを使用したC++コールバック

int main(int argc, char* argv[]) { 
    CustomFileFormat f1; 
    f1.open("c:/file1.xyz"); 
    f1.process(); 

    CustomFileFormat f2; 
    f2.open("c:/file2.xyz"); 
    f2.process(); 

    Result r = f1.compare(f2); 
    r.generateReport(); 

    return 0; 
} 

問題は、process()関数を使用していることです。この関数は次のように定義されたコールバック関数を公開するサードパーティのライブラリにコマンドを送信します。

typedef void (*FileProgressCallback)(double dProgress, bool& shouldAbort); 

このコールバック関数は、受信した(どのくらいのファイルのが処理された私に言って、サードパーティのライブラリから呼び出されますdProgressの値は0と1の間です)、処理を停止させるために使用できるshouldAbort bool変数。

process()関数をコーディングする方法がわからないので、コールバックが呼び出されたときに返される結果がインスタンスf1かインスタンスf2かどうかがわかります。私のCustomFileFormatクラスのメンバ関数を定義することは可能ですか?呼び出された時、どの(これ)が使われているのか分かりますか?

+0

現在のインスタンスで静的またはグローバル変数を作成することによって、オブジェクトのどのインスタンスが再生されているかを何らかの形で記録する必要があります。 – PaulMcKenzie

答えて

0

単純な方法は、.process()呼び出しの前にいくつかのコンテキストでグローバル設定を行うことです。グローバルなスタックを作成すると、再帰的な処理を実行することもできます(ただし、説明したように、必要な部分のようには聞こえません)。

より複雑な答えは、libffiのクロージャのようなものを使用することです(ライブラリはhttps://sourceware.org/libffi/または​​から入手可能です)。ライブラリーのその部分は、呼び出し側から受け取ったものと追加のパラメーターを関連付けることができる、実行時にコードの実際の(小さな)ビットを生成します。

+0

私はグローバルの使用を検討していましたが、それは2つの異なるスレッドで2つの異なるインスタンスに対してprocess()を実行できないことを意味します。 –

+0

この操作を複数のスレッドで同時に実行する必要がある場合は、グローバルをスレッドローカルにすることができます。 – SoronelHaetir

関連する問題