アルゴリズムを関数のコレクションとして公開する場合、パラメータの 1 つを次のようなシグネチャを持つ関数ポインタにする方法があります。
void (*reportProgress)(void*, int)
しかし、C++ でアルゴリズムを設計している場合は、おそらくカプセル化を利用して、アルゴリズムのクラス (またはクラスのセット) を作成する必要があります。この場合、関数ポインタをパラメータとして個々の関数に追加したくないでしょう。
むしろ、関数ポインターをクラスのメンバーにすることができます。また、それを取得/設定するためのアクセサ メソッドがあります。またはさらに良いのは、進捗状況を報告するための抽象クラスを提供することです。
class ProgressReporter
{
public:
virtual ~ProgressReporter() = 0;
virtual void notifyProgressChanged(void* source, int progressValue) = 0;
}
class Algo
{
private:
ProgressReporter* _userProvidedReporter = NULL;
public:
void set_ProgressReporter(ProgressReporter*); // set accessor
ProgressReporter* get_ProgressReporter(); // get accessor
void my_heavy_algorithm(int*, int, ...); // your algo. implementation fn.
}
void Algo::set_ProgressReporter(ProgressReporter* reporter){
_userProvidedReporter = reporter;
}
ProgressReporter* Algo::get_ProgressReporter(){
return _userProvidedReporter;
}
void Algo::my_heavy_algorithm(int * data, int n,...){
// do stuff
if(_userProvidedReporter != NULL)
_userProvidedReporter->notifyProgressChanged((void*)this, currentProgress);
// do more stuff
if(_userProvidedReporter != NULL)
_userProvidedReporter->notifyProgressChanged((void*)this, currentProgress);
// so on and so forth..
}
もちろん、上記はかなり単純化された例です。アルゴリズムが同時実行をサポートすると予想される場合は、内部ユーザー レポーターへのアクセスを同期する必要があります。アルゴリズムの基本クラスを作成し、具体的な派生実装を提供することを検討してください。