opDispatch does accept additional template parameters but they cannot be specified: ==== module test.d; import std.stdio; struct DispatchTest { void opDispatch(string name, string otherName)() { writeln(name, ":", otherName); } } void main() { DispatchTest t; //t.testName!("testOtherName")(); t.opDispatch!("testName", "testOtherName")(); } ==== This compiles fine but if I remove the commented line, dmd (v2.048) tells me: test.d(13): Error: template instance opDispatch!("testName") does not match template declaration opDispatch(string name,string otherName) The error seems OK for a "normal" function, but for opDispatch, it seems limiting to me: the first call should translate to the second. Here's an other, similar, test: ==== module test.d; import std.stdio; struct DispatchTest { void opDispatch(string name, T)(T t) { writeln(name, ":", T.stringof); } } void main() { DispatchTest t; //t.testName!(DispatchTest)(t); t.testName(t); } ==== Which gives, when uncommenting: test.d(13): Error: template instance opDispatch!("testName") does not match template declaration opDispatch(string name,T).
Simen Kjaeraas found a solution: http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=117353 === The correct way to do what you want is this: module foo; import std.stdio; struct test { template opDispatch( string name ) { void opDispatch( string other )( ) { writeln( name, ", ", other ); } } } void main( ) { test t; t.foo!( "Hey!" )( ); } ===