2

他の 2 つの純粋関数の乗算を返す純粋関数を作成しようとしています。

pure Func multiplyFunctions(Func,Real)(scope const Func f1, scope const Func f2)
{
    return (Real a) { return f1(a) * f2(a); };
}

残念ながら、私は問題に直面しています.1つ目は、f1とf2をopCallが定義された純粋な関数/デリゲート/クラスであると宣言したい...純粋な関数から呼び出しているためです。

しかし、2番目の最も問題と思われるのは、f1とf2を1つの「実」値を返す「実」変数の関数にしたいということです...しかし、テンプレート化する方法がわかりませんこのアウト...

誰にもアイデアはありますか?

4

1 に答える 1

3

まず、scope;を削除します。デリゲートのスコープがエスケープされているため、間違っています。

次に、次のようなものを試してください。

real delegate(real) multiplier(const real delegate(real) pure f1,
                               const real delegate(real) pure f2) pure
{
    real multiply(real val) { return f1(val) * f2(val); }
    return &multiply;
}

テンプレートでこれを試すこともできますが、次の理由はあまりありません。

pure auto multiplier(alias F1, alias F2)(ParameterTypeTuple!F1 args)
{
    return F1(args) * F2(args);
}

real square(real a) pure { return a * a; }

alias multiplier!(square, square) squareMultiplier;

//Now squareMultiplier is a multiplier of square()

コンパイラにはバグがあり、純度が 100% 正しくならないことに注意してください。

于 2011-07-24T07:49:18.640 に答える