Angenommen, Sie haben eine Vektorklasse, die eine Schablonenlänge und einen Schablonentyp hat - d.h. vec<2,float>
. Diese können auch verschachtelt werden - vec<2,vec<2,vec<2,float> > >
, oder vec<2,vec<2,float> >
. Wie tief ein solcher Vektor verschachtelt ist, lässt sich wie folgt berechnen:
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]); }
Das Problem ist, dass man erst zur Laufzeit weiß, wie tief es ist, aber man muss die Tiefe zur Komilzeit kennen, um so etwas tun zu können:
// 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;
}
Sie können nicht einfach eine "if"-Anweisung einfügen, weil (a) die tiefere Ebene den Rückgabetyp beeinflusst und (b) coerce() einen Erstellungsfehler erzeugt, wenn Sie versuchen, einen verschachtelten Vektor mit einem weniger verschachtelten Vektor zu verknüpfen.
Ist es möglich, so etwas zu tun, oder stoße ich an die Grenzen von C++-Vorlagen?