Скажем, у вас есть векторный класс, который имеет длину и тип шаблона, т.е. vec<2,float>
. Они также могут быть вложенными - vec<2,vec<2,vec<2,float> > >
или vec<2,vec<2,float> >
. Вы можете рассчитать, насколько глубоко вложенный один из этих векторов выглядит так:
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]); }
Беда в том, что вы не будете знать, насколько она глубока до времени выполнения, но вам может понадобиться узнать глубину во время компиляции, чтобы сделать что-то вроде этого:
// 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;
}
Вы не можете просто добавить оператор if, потому что (a), который глубже влияет на тип возвращаемого значения, и (b) coerce () генерирует ошибку сборки, если вы пытаетесь привести вложенный вектор к менее вложенному. один.
Возможно ли сделать что-то подобное или я столкнулся с ограничениями шаблонов C ++?