D template overloading

vitamin_

D template overloading
« kdy: 23. 01. 2014, 09:14:29 »
Mam nasledovny kod v jazyku D:
Kód: [Vybrat]
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.


Preco je 2. template viac specializovany ako 1. ?


jméno

Re:D template overloading
« Odpověď #1 kdy: 23. 01. 2014, 10:24:07 »
Template 2 nepoužívá typovou proměnnou T, ale odkazuje se přímo na třídu X.

vitamin_

Re:D template overloading
« Odpověď #2 kdy: 23. 01. 2014, 11:18:30 »
Je 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.





Daniel Kozak

Re:D template overloading
« Odpověď #3 kdy: 23. 01. 2014, 13:11:01 »
Je 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.

Daniel Kozak

Re:D template overloading
« Odpověď #4 kdy: 23. 01. 2014, 13:51:18 »
Je 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.

kazdopadne jazyk D pouziva stejne pravidla jako C++ (http://msdn.microsoft.com/en-us/library/zaycz069.aspx)


vitamin_

Re:D template overloading
« Odpověď #5 kdy: 23. 01. 2014, 15:04:31 »
...
Na co to potrebujes? Nejak si nedokazu predstavit k cemu by to bylo uzitecne.
Pisem si vlastny kompilator (jazyk ma templaty ako v D, vytvaranie instancii, dedukciu  a specializaciu template parametrov mam hotovu, teraz riesim overloading templatov).

c++ nema dedukciu typov zo specializacie, v takych pripadoch uz niesu pravidla rovnake ako v c++

Uz som asi zistil ako to funguje, kod nizsie to demonstruje:
Kód: [Vybrat]
class X{}

template t1(A, T : void function(U), U){enum t1 = "1";}  //najmenej specializovany template
template 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

Sten

Re:D template overloading
« Odpověď #6 kdy: 23. 01. 2014, 16:56:22 »
c++ nema dedukciu typov zo specializacie, v takych pripadoch uz niesu pravidla rovnake ako v c++

Ale má:
Kód: [Vybrat]
template <typename T>
struct Test
{};

template <typename T>
struct Test<std::shared_ptr<T>>
{};

Není totiž specializace (částečná) jako specializace (úplná)

Re:D template overloading
« Odpověď #7 kdy: 23. 01. 2014, 17:17:20 »
Myslel som nieco taketo:
Kód: [Vybrat]
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;
}