gpt4 book ai didi

c++ - 提取 size_t 模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:03 27 4
gpt4 key购买 nike

我想知道访问 size_t 模板参数的最佳方法是什么,以便我可以将它传递给另一个模板化类(而不是通过方法调用)。例如,如果我有类(class),

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 相同的参数,但是编译器不会捕获错误,例如将笛卡尔定义的 Line 与 Spherically 定义的 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;

最佳答案

在C++11中,你可以转

size_t dims() const {return D;}

进入

static constexpr size_t dims() {return D;}

等等

template<typename Point_t>
class Line : public Shape<typename Point_t::type, Point_t::dims()> {..};

关于c++ - 提取 size_t 模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com