1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
template<class T> struct typeinfo { // Fournit des types
typedef T type;
const static T TypicVal = T();
}; //+ spécialisations
template<class T> struct virtualget { // *Fournit une fonction virtuelle à Node_ pour le type T.
protected :
virtual typeinfo<T>::type getVal(const typeinfo<T>::type&) {return typeinfo::TypicVal;} //histoire que la fonction ne soit pas pure,
}; //le mieux serait peut etre que cette fonction provoque une erreur a l'execution...
// le parametre de getVal est 'fictif', seulement utile pour la sélection de la surcharge.
template<int n, class T, class ...Args> struct typerval : public typerval<n-1,Args...> {}; //structure vide tant que le parametre int n'est pas nul
template<class T, class ...Args> struct typerval<0, T, Args...> : public typeinfo<T> {typedef typeinfo<T>::type valuetype;} // Quand le parametre int est nul, on place un typedef sur le n-ieme type
template<class... Args> class Node_; // pré déclaration de Node_
template<> class Node_<> {}; // cas de zéro paramètres
template<class T, class ... Args> class Node_ : public virtualget<T>, Node_<Args...> {}; //Dote Node_ d'une fonction virtuelle non pure (voir *) pour chaque type possible.
template class Node<int n, class... Args); // pré déclaration de Node
template<> class Node<int n> : public Node_<> {} // Cas d'aucun type.
template<int n, class T, class ... Args> class Node : public Node_<T, Args...>, typerval<n,T, Args...> {private : valuetype val; protected : valuetype getval() const {return getValue(val);}}; // |
Partager