On Friday, 6 March 2020 at 14:14:04 UTC, Adam D. Ruppe wrote:
On Friday, 6 March 2020 at 14:05:55 UTC, Steven Schveighoffer wrote:
Adam's way doesn't work either, because the call doesn't use the alias, but just instantiates opDispatch with the new name!'

oh yikes, how did I not notice that?!

so yeah just kinda screwed. I'd probably suggest at tis point having the opDispatch be a trivial implementation that just forwards to another named method.

struct A {
  template opDispatch(string name) {
     auto opDispatch(T, Args...)(Args args) {
           return other_name!(name, T, Args)(args);
     }
  }

  auto other_name(string name, T, Args...)(Args args) {
      // real implementation
  }
}


and then to test it externally you do

a.other_name!("whatever", Bitmap)(args, here);

This isn't the worst thing to use and since it's just for testing it's fine.

I came up with a similar interface like a.other_name!("whatever", Bitmap)(args, here); after discarding .opDispatch() and I called the thing
 .dispatch(T, string fn, ARGS...)(...).

But didn't like the string part and that's when I introduced the alias fn because I figured maybe it's possible to do something like:
  factory.dispatch!(Bitmap.load)(handle, path);
and get the Bitmap part from that alias and hence save the duplicate Bitmap type in factory.dispatch!(Bitmap, Bitmap.load)(...);

Anyways thanks for your help.

Reply via email to