Frage

Ich versuche eine reine Funktion zu erstellen, die die Multiplikation von zwei anderen reinen Funktionen zurückgibt:

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

Leider bin ich auf Probleme, die Nummer eins, ich möchte F1 und F2 als reine Funktionen/Delegierten/Klassen mit definierter OPCall als pure Funktionen/Klassen deklarieren ... was erforderlich ist, weil ich sie von einer reinen Funktion aufrufe.

Aber Nummer zwei und was am problematischsten zu sein scheint, ist, dass ich möchte, dass F1 und F2 Funktionen einer "echten" Variablen sein, die einen "echten" Wert zurückgibt ... aber ich kann nicht herausfinden, wie man die Vorlage erfolgt das raus ...

Hat jemand irgendwelche Ideen?

War es hilfreich?

Lösung

Entfernen Sie zunächst die scope; Es ist falsch, weil die Bereiche der Delegierten entkommen sind.

Zweitens probieren Sie so etwas wie:

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;
}

Sie können dies auch mit Vorlagen versuchen, obwohl es keinen großen Grund gibt:

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()

Beachten Sie, dass es gibt Käfer In dem Compiler, der die Reinheit nicht zu 100% korrekt ist, müssen Sie sich also nur mit ihnen abfinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top