Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: vitamin_ 23. 01. 2014, 09:14:29
-
Mam nasledovny kod v jazyku D:
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. ?
-
Template 2 nepoužívá typovou proměnnou T, ale odkazuje se přímo na třídu X.
-
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.
-
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.
-
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)
-
...
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:
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
-
c++ nema dedukciu typov zo specializacie, v takych pripadoch uz niesu pravidla rovnake ako v c++
Ale má:
template <typename T>
struct Test
{};
template <typename T>
struct Test<std::shared_ptr<T>>
{};
Není totiž specializace (částečná) jako specializace (úplná)
-
Myslel som nieco taketo:
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;
}