Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: vitamin_ 23. 01. 2014, 09:14:29

Název: D template overloading
Přispěvatel: vitamin_ 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. ?
Název: Re:D template overloading
Přispěvatel: jméno 23. 01. 2014, 10:24:07
Template 2 nepoužívá typovou proměnnou T, ale odkazuje se přímo na třídu X.
Název: Re:D template overloading
Přispěvatel: vitamin_ 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.




Název: Re:D template overloading
Přispěvatel: Daniel Kozak 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.
Název: Re:D template overloading
Přispěvatel: Daniel Kozak 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)
Název: Re:D template overloading
Přispěvatel: vitamin_ 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
Název: Re:D template overloading
Přispěvatel: Sten 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á)
Název: Re:D template overloading
Přispěvatel: vitamin 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;
}