Domanda

Sto cercando di creare una funzione pura che restituisce la moltiplicazione di due altre funzioni pure:

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

Purtroppo, sto correndo in problemi, il numero uno, voglio dichiarare F1 e F2 per essere puri funzioni / delegati / classes con opCall definito ... che è richiesto perché io li sto chiamando da una funzione di pura.

Ma il numero due, e quello che sembra essere la più problematica, è che voglio F1 e F2 per essere funzioni di una variabile "Reale" che il ritorno di un valore "reale" ... ma io non riesco a capire come al modello questo fuori ...

Qualcuno ha qualche idea?

È stato utile?

Soluzione

Prima di tutto, rimuovere il scope; È sbagliato, perché gli scopi dei delegati sono fuggiti.

In secondo luogo, provare qualcosa di simile:

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

Si può anche provare a fare questo con i modelli, anche se non c'è molto di un motivo per:

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

Si noti che ci sono bug nel compilatore che non permettono la purezza di essere corretta al 100%, quindi dovrete solo mettere in su con loro per ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top