On Wednesday, 8 August 2012 at 23:21:32 UTC, Ellery Newcomer wrote:
say I have

template T(alias fn) {
}

class Foo {
  int i();
  void i(int);
}

alias T!(Foo.i) Biz;

Is there a way to get a handle to both of the overloads of Foo.i inside T?

Actually, all I really need for that is to get 'Foo.i' out of fn.

mangleof looks promising..

import std.typetuple : TypeTuple;
template Id(alias a) { alias a Id; }

template T(alias fn) {
    alias Id!(__traits(parent, fn)) Parent;
    // use Id template so we cannot alias __traits result directly
    static assert(is(Parent == Foo));

    enum FnName = __traits(identifier, fn);

alias TypeTuple!(__traits(getOverloads, Parent, FnName)) Overloads; // use TypeTuple template so we cannot alias __traits result directly
    pragma(msg, typeof(Overloads[0]));  // prints int()
    pragma(msg, typeof(Overloads[1]));  // prints void(int)
}

class Foo {
    int i();
    void i(int);
}
alias T!(Foo.i) Biz;

Reply via email to