引数と戻り値は、delegateを使って、

T delegate(T) twice(T)(T delegate(T) f) {
  return (T x) { return f(f(x)); };
}

と書いてみたのですが、
 auto f = twice(&twice!(int));
と書くと、
 twice(T) cannot deduce template function from argument types !()(int delegate(int x) function(int delegate(int x) f))
となり、エラーがでてしまいます.