Ugly C++ like template and mixin magic solution:

struct r(T){ alias T type;}
template str(alias A) if(is(A == r!(A.type))) { const char[] str = "ref " ~ A.type.stringof; }
template str(T) { const char[] str = T.stringof; }
template str(T, A...) { const char[] str = str!T ~ ", " ~ str!A; }

struct functor(A...) {
  void opAssign(C)(C callable) { m_fp = callable; }
  void opCall(R...)(auto ref R r) { m_fp(r); }
  private {
    mixin("void function(" ~ str!A ~ ") m_fp;");
  }
}

void foo(ref int a, int b) { a += b; }

void main()
{
  functor!(r!int, int) f;
  f = &foo;
  int a = 1, b = 2;
  f(a, b);
  assert(a == 3);
}

Reply via email to