Testing presence of member functions with same name but different signature.

Matthias Walter xammy at xammy.info
Thu Feb 6 13:32:54 PST 2014


Hi,

I realized the following behavior and want to ask whether this is
expected behavior and if yes, I'd like to know a reason.

The check of MyClass.func(MyClass.A) and MyClass.func(MyClass.B) in the
main() function succeeds, but the alias line *in* the class definition
fails with "template instance main.ConditionalUse!(MyClass) does not
match template declaration ConditionalUse(T) if (hasFuncs!T)".

If I rename func to funcA and funcB (making the name unambiguous), both
checks succeed.

Is this a bug?

template hasFuncs(T) // Checks presence of T.func(T.A) and T.func(T.B)
{
  enum bool hasFuncs =
      is(typeof((T t, T.A a){ t.func(a); }))
    &&
      is(typeof((T t, T.B b){ t.func(b); }));
}

struct ConditionalUse(T) if (hasFuncs!T) { }

// This line fails with
//
// template instance main.ConditionalUse!(MyClass) does not
// match template declaration ConditionalUse(T) if (hasFuncs!T)

class MyClass
{
  struct A {}
  struct B {}

  alias ConditionalUse!MyClass Foo;

  void func(A a) { }
  void func(B b) { }
}

int main(char[][] args)
{
  static assert(hasFuncs!MyClass); // This assert is fine.
  return 0;
}

Best regards,

Matthias


More information about the Digitalmars-d mailing list