大きなライブラリに新しいモジュールを追加しています。ここにあるすべてのメソッドは、静的として実装されています。簡略化されたモデルについて簡単に説明します。
typedef std::vector<double> TData;
double test ( const TData &arg ) { return arg ( 0 ) * sin ( arg ( 1 ) + ...;}
double ( * p_test ) ( const TData> &arg) = &test;
class A
{
public:
static T f1 (TData &input) {
.... //some computations
B::f2 (p_test);
}
};
内部f1()
でいくつかの計算が実行され、静的メソッドB::f2
が呼び出されます。f2
メソッドは別の作成者によって実装されており、いくつかのシミュレーション アルゴリズムを表しています (ここでの例は単純化されています) 。
class B
{
public:
static double f2 (double ( * p_test ) ( const TData &arg ) )
{
//difficult algorithm working p_test many times
double res = p_test(arg);
}
};
f2
メソッドには、いくつかの重み関数へのポインターがあります (ここでは) p_test
。しかし、私の場合、メソッドのf1
ために計算されたいくつかの追加パラメータが必要ですtest()
double test ( const TData &arg, const TData &arg2, char *arg3.... ) { }
メソッドのソースコードの変更(簡単ではない)、ライブラリの再設計、および汚いハックなしで回避するtest()
ために、これらのパラメータを(などに)注入する方法:-) ?f2
f2
最も簡単な手順はオーバーライドすることですf2
static double f2 (double ( * p_test ) ( const TData &arg ), const TData &arg2, char *arg3.... )
しかし、後で何をしますか?メソッドは静的であるため、オブジェクトに問題があると考えてください。
更新された質問
テンプレートパラメータに依存する関数へのポインタを作成したり、そのようなことをしたりすることは可能ですか?
if (condition) res = p_test(arg);
else res = p_test2(arg, arg2, arg3);