假定类模板参数

Assume class template arguments

本文关键字:参数      更新时间:2023-10-16

我有一个Kd-Tree实现,它被模板化以接受任何大于0的维度和任何浮点类型(浮点、双精度等)

template <typename real, size_t dimensions> class KdTree
{
// stuff
}

我有一个附带的"点"类型,它有完全相同的模板布局。但是,需要从kd树类外部访问此点类型。现在,每次我需要在kd树代码中创建临时点时,我都需要显式地使用KdPoint<real, dimensions>,这很烦人,使我的行很长,并且不会给代码增加任何值。

有没有什么方法可以告诉编译器隐式地假设realdimensions的值也传递给了点的类?在某种程度上将两个模板列表链接在一起。这样,我只需键入KdPoint,编译器就可以根据类接收到的模板参数直接知道要在其中放入什么。

否则,我需要使用宏将后者显式扩展为前者,这有点糟糕。

您可以将typedef添加到KdTree类:

template <typename real, size_t dimensions> class KdTree
{
typedef KdPoint<real, dimensions> KdPoint_;
// stuff
};

并在内部使用CCD_ 6。如果您希望点类型可以从外部访问,请为typedef提供公共访问权限,并提供一个不以_:结尾的名称

template <typename real, size_t dimensions> class KdTree
{
public:
typedef KdPoint<real, dimensions> KdPointType;
// stuff
};

然后可以这样访问:

KdTree<float, 5>::KdPointType
template <typename real, size_t dimensions> class KdTree
{
public:
typedef KdPoint<real, dimensions> point_type;
}