Supposons que vous ayez une classe de vecteur qui a une longueur et un type de modèle, c'est-à-dire vec<2,float>
. Ceux-ci peuvent également être imbriqués - vec<2,vec<2,vec<2,float> > >
ou vec<2,vec<2,float> >
. Vous pouvez calculer à quel point emboîtés l'un de ces vecteurs est comme ceci:Modèles C++: calculez des valeurs et prenez des décisions au moment de la compilation
template<typename T>
inline int depth(const T& t) { return 0; }
template<int N, typename T>
inline int depth(const vec<N,T>& v) { return 1+depth(v[0]); }
Le problème est que vous ne saurez pas si elle est profonde jusqu'à l'exécution, mais vous pouvez avoir besoin de connaître la profondeur à comile temps afin de faire quelque chose comme ceci:
// Do this one when depth(v1) > depth(v2)
template<int N, typename T, int M, typename U>
inline vec<N,T> operator +(const vec<N,T>& v1, const vec<M,U>& v2) {
return v1 + coerce(v2,v1);
}
// Do this one when depth(v1) < depth(v2)
template<int N, typename T, int M, typename U>
inline vec<M,U> operator +(const vec<N,T>& v1, const vec<M,U>& v2) {
return coerce(v1,v2) + v2;
}
Vous ne pouvez pas simplement jeter dans un « si » parce que (a) qui est plus profonde affecte le type de retour et (b) coerce() génère une erreur de construction si vous essayez de contraindre un vecteur imbriqué à un vecteur imbriqué.
Est-il possible de faire quelque chose comme ça ou suis-je poussé dans les limites des templates C++?
Si 'coerce' est capable de vérifier au moment de la compilation, vous y trouverez probablement votre réponse! –
Limites des modèles C++. Ha. – GManNickG
Il n'y a aucune limite aux modèles C++. –