Прежде всего, удалите 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% правильной, поэтому вам просто придется с этим смириться.