2016-07-28 31 views
1
module a; 
void foo(T)(){ 
    import std.stdio; 
    writeln(T.stringof); 
} 

module b; 
import a; 

private alias foo = a.foo; 
void foo(T: int)(){ 
    import std.stdio; 
    writeln("Special int"); 
} 
//app.d 
void main() 
{ 
    import a; 
    import b; 
    foo!int(); 
} 

Diese Drucke int anstelle von Special Int. Ist es möglich, Vorlagen auf verschiedene Module zu spezialisieren?Wie spezialisiere ich Vorlagen auf verschiedene Module?

Kann ich davon ausgehen, dass die Antwort auf D template specialization in different source file noch heute relevant ist?

Antwort

1

Ihr Alias ​​ist falsch und Ihr Import führt zu Mehrdeutigkeiten. Wenn Sie es öffentlich überladbar machen wollen, machen Sie den Alias ​​nicht privat!

Sobald die Alias ​​veröffentlicht wird (der Standard btw), das Kompilieren einen Namenskonflikt Fehler ausspucken:

iii.d(6): Error: a.foo(T)() at ii.d(2) conflicts with b.foo at i.d 

Dann ist es einfach eine Frage der Disambiguierung (Angabe b.foo!int()), oder besser noch Entfernen der unnötigen import a von der Verwendungsstelle.

//app.d 
void main() 
{ 
    import b; 
    foo!int(); 
} 

Spezial int!

Für komplexere Fälle können Sie auch einen Wrapper für die Vorlage machen und Ihre Argumente, aber hier ist die einfache alias Überlastung - wenn sie mit alias foo = a.foo; getan, kein private, wird es tun.