Мне было интересно, как лучше всего получить доступ к параметру шаблона size_t, чтобы я мог передать его другому шаблону (а не вызову метода). Например, если у меня есть классы,Извлечение параметров шаблона size_t
template<typename T, size_t D> class Point;
template<typename T> class Line;
template<typename T, size_t D>
class Shape
{
public:
virtual size_t dims() const = 0;
virtual bool intersects(Point<T,D> p) const = 0;
virtual bool intersects(Line<Point<T,D>> l) const = 0;
}
template<typename T, size_t D>
class Point : Shape<T,D>
{
public:
typedef T type;
size_t dims() const {return D;}
type val(size_t d) {return vals[d];}
bool intersects(Point<T,D> p)
{
for(size_t d=0; d<D; ++d) if(p.vals[d] != vals[d]) return false;
return true;
}
bool intersects(Line<Point<T,D>> l)
{
return l.intersects(*this);
}
protected:
type vals[D];
};
// How do I get D???
template<typename Point_t>
class Line : public Shape<typename Point_t::type,??>
{
public:
typedef typename Point_t::type type;
size_t dims() const {return point.dims();}
bool intersects(Point<type,??> p) {/*stuff*/}
bool intersects(Line<Point_t> l) {/*stuff*/}
private:
Point_t point;
type slope;
};
Я хочу, чтобы гарантировать, что метод пересекает в линии работает только для линии, пересекающей точку одних и тех же размеров (предотвратить 3D пересекающую 2D-точки). Я думал о том, что Line использует те же параметры, что и Point, но тогда компилятор не будет ловить ошибки, такие как пересечение декартовой определенной линии с сферически определенной точкой (так как оба они равны Point<double,3>
). С тем, как я это делаю выше, я могу определить декартовые и сферические классы, чтобы избежать этой проблемы.
template<typename T, size_t D> class Cartesian : public Point<T,D>{/*stuff*/}
template<typename T> class Spherical : public Point<T,3> {/*stuff*/}
Line<Cartesian<double,3>> Line;
Cartesian<double,3> C3Point;
Cartesian<double,2> C2Point;
Spherical<double> SPoint;
Line.intersects(C3Point); // ok
Line.intersects(C2Point); // compiler error
Line.intersects(SPoint); // compiler error
редактировать: то, что я в настоящее время сделать, это определить класс Line, как
template<typename Point_t, size_t D>
class Line : public Shape<typename Point_t::type,D>
{/*stuff*/}
, который работает, но содержит избыточную информацию ...
Line<Cartesian<double,3>,3> Line;
Второй не обрабатывает пример OP. –
@ T.C .: Просто увидел это. – Jarod42
Вам не нужно 'typename' перед' Point_t :: type'? –