2

ClassA と ClassB の 2 つのクラスがあります。ClassA には 3 つのメソッドがあります。

double Foo(double, ClassB);
double Bar(double (*f)(double));
double Baz(double, ClassB);

Baz に基づいて、Foo 内に関数 Qux を定義したいと思いますが、ClassB 型の引数はありません。

double ClassA::Foo(double x, ClassB y)
{
    // double Qux(double .) = Baz(., y)
    Bar((*Qux))
}

誰かが何か考えがありますか?

これは良い方法ではないと答える人もいると思います。具体的な状況を説明するために、積分を計算するために数値法 ( http://en.wikipedia.org/wiki/Simpson%27s_rule ) を使用して金融資産の価格を設定しています。

ClassA: FinancialAsset

ClassB: PrincingModel

Foo: FinancialAsset.Price(date, PrincingModel)

Bar: FinancialAsset.SimpsonMethod(FunctionOneArgument)

Baz: FinancialAsset.FunctionTwoArguments(date, PrincingModel)

そして、私は探しています:

Qux: FunctionOneArgument(date) = FinancialAsset.FunctionTwoArguments(date, PrincingModel)

この構造に対処する良い方法は何かわかりません。私はあなたがそれを行うためのより良い/より多くのC ++の方法を持っています、私は取ります:)

ありがとう

4

3 に答える 3

1

C++11 を使用しているかどうかに応じて、古い C++ バージョンの場合はstd::bindandstd::functionまたはboost::bindandが必要です。boost::function

バインディングを使用すると、関数を取得して 0 個以上のパラメーターをバインドしたり、パラメーターを再配置したりできます。実際、上記のものは次のようになります。

double ClassA::Foo(double x, ClassB y)
{
    boost::function<double> baz = boost::bind(this, ClassA::Baz, _1, y);
    Bar(baz);
}

また、Bar の署名はboost::function、関数ポインターの代わりに を使用します。

私の構文は、メンバー関数をバインドするために少しずれている可能性があることに注意してください。詳細については、ドキュメントを参照してください。

ここを参照してください: http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.html

またはここ: http://en.cppreference.com/w/cpp/utility/functional/bind

于 2013-06-17T13:52:42.360 に答える