Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Πως ονομαζεται η παρακατω μακαροναδα;

>class Y1{};
class Y2{};
class YN{};

template < class T >
class A : A <T>
{
};

template <>
class A <Y1>
{
};
template <>
class A <Y2>
{
};
template <>
class A <YN>
{
};

 

Δημοσ.

Αν εννοείς αυτό

 

>
template < class T > class A : A <T> {};

 

ονομάζεται CRTP. Τα υπόλοιπα δεν έχουν τίποτα το ξεχωριστό.

 

Αλλά έχω αμφιβολίες μήπως δεν κατάλαβα την ερώτηση γιατί αν έπρεπε να στοιχηματίσω θα πόνταρα ότι το ξέρεις ήδη.

Δημοσ.

Οχι αυτο. Λαθος μου

>class Y1{};
class Y2{};
class YN{};

template < class T >
class A
{
};

template <>
class A <Y1>
{
};
template <>
class A <Y2>
{
void foi(){}
};
template <>
class A <YN>
{
void bar(){}
};


A<Y2>::foo <-- υπαρχει
A<Y2>::bar <-- δεν υπαρχει

 

Δηλαδη το να εχεις διαφορετικες κλασεις αναλογα του template (ξερω τι κανει απλος δεν ξερω πως ονομαζεται, και θελω να δω που βολευει)

Δημοσ.

OK τότε μήπως policy-based design? Στην ουσία δηλαδή το ίδιο πράγμα που κάνουν πολλές template classes της standard library παίρνοντας traits και allocator σαν type parameter (π.χ. std::basic_string).

 

Ακόμα όμως δεν ξέρω αν κατάλαβα. :-D

 

nop happy.gif

 

Τωρα που δοκιμασα ειδα οτι γινεται και σε functions

πχ

>template <class T>
void foo(T t)
{
std::cout<<"Ayto to impl einai gia otidipote ektos apo int kai double"<<std::endl;
}
template<>
void foo<int>(int t)
{
std::cout<<"Ayto impl einai mono gia int"<<std::endl;
}
template<>
void foo<double>(double d)
{
std::cout<<"Ayto to imp einai mono gia double"<<std::endl;
}
int main(int argc, char  *argv[])
{

foo(1);
foo(1.1);
foo("");

 

 

αοθτπθτ

>Ayto impl einai mono gia int
Ayto to imp einai mono gia double
Ayto to impl einai gia otidipote ektos apo int kai double

 

 

ΥΓ τωρα ειναι πιο κατανοητο happy.gif

υγ2 δηλαδη κανει overload αλλα εξαρτωμενο απο το template

υγ3 το βρηκα, partial specialization

υγ4 γαμω τα αγγλικα μου γαμω....

Δημοσ.

Βασικά αυτό είναι full specialization.

 

Partial specialization είναι π.χ. αυτό:

>template<class X, class Y> class Foo {} // αρχικό template
template<class Y> class Foo<int, Y> class Foo {} // specialized για όλα τα Y όταν Χ = int

και αυτό:

>template<class Τ> class Foo {} // αρχικό template
template<class Τ> class Foo<Τ*> class Foo {} // specialized για όλα τα Τ που είναι pointer types

 

Επίσης, partial specialization γίνεται σε class templates αλλά όχι σε function templates -- εκεί όμως υπάρχουν άλλα κόλπα με τα οποία μπορείς να καταλήξεις στο ίδιο αποτέλεσμα (π.χ. με overloads ή κάνοντας την function ένα non-specialized member ενός partially specialized class template).

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...