import std.stdio;class X{}template t1(T : void function(T)){enum t1 = "1.";} template t1(T : void function(X)){enum t1 = "2.";}int main(string[] argv){ t1!(void function(X)).writeln(); readln(); return 0;}//output: 2.
Citace od: vitamin_ kdy 23. 01. 2014, 11:18:30Je niekde kompletny popis pravidiel na zaklade ktorych sa vyhodnocuje uroven specializacie v templatoch? V dokumentacii k D som to nenasiel, vzdy len jednoduche priklady ktore neriesia zlozitejsie specializacie.
Citace od: Daniel Kozak kdy 23. 01. 2014, 13:11:01Citace od: vitamin_ kdy 23. 01. 2014, 11:18:30Je niekde kompletny popis pravidiel na zaklade ktorych sa vyhodnocuje uroven specializacie v templatoch? V dokumentacii k D som to nenasiel, vzdy len jednoduche priklady ktore neriesia zlozitejsie specializacie.Na co to potrebujes? Nejak si nedokazu predstavit k cemu by to bylo uzitecne.
Citace od: Daniel Kozak kdy 23. 01. 2014, 13:11:01...Na co to potrebujes? Nejak si nedokazu predstavit k cemu by to bylo uzitecne.
class X{}template t1(A, T : void function(U), U){enum t1 = "1";} //najmenej specializovany templatetemplate t1(A, T : void function(T)){enum t1 = "2";} //template t1(A, T : void function(A)){enum t1 = "3";} //najviac specializovany template enum e = t1!(X, void function(X)); //e == 3
Citace od: vitamin_ kdy 23. 01. 2014, 15:04:31c++ nema dedukciu typov zo specializacie, v takych pripadoch uz niesu pravidla rovnake ako v c++
template <typename T>struct Test{};template <typename T>struct Test<std::shared_ptr<T>>{};
template Test(T : U*, U){ //staci specifikovat T, parameter U sa doplni zo specializacie T struct Test{}}int main(){ Test!(int*) t; //T == int*, U == int return 0;}