我有一个Kd-Tree实现,它被模板化以接受任何大于0的维度和任何浮点类型(float,double等等)。像这样:
template <typename real, size_t dimensions> class KdTree
{
// stuff
}
我有一个伴随的“点”类型,它具有完全相同的模板布局。但是,此点类型需要可以从kd-tree类外部访问。现在,每次我需要在我的kd-tree代码中创建临时点时,我需要明确地去KdPoint<real, dimensions>
,这是令人厌倦的,使我的行很长,并且没有为代码添加任何值。
有什么方法可以告诉编译器隐式假设real
和dimensions
的值也被传递给了类的类?在某种程度上将两个模板列表链接在一起。这样我就可以输入KdPoint
,编译器将根据类接收的模板参数直接知道放在那里的内容。
否则我需要使用宏来明确地将后者扩展为前者,这种情况很糟糕。
答案 0 :(得分:1)
您可以向KdTree
类添加typedef:
template <typename real, size_t dimensions> class KdTree
{
typedef KdPoint<real, dimensions> KdPoint_;
// stuff
};
并在内部使用KdPoint_
。如果您希望外部可以访问点类型,请提供typedef
公共访问权限,以及不以_
结尾的名称:
template <typename real, size_t dimensions> class KdTree
{
public:
typedef KdPoint<real, dimensions> KdPointType;
// stuff
};
然后可以这样访问:
KdTree<float, 5>::KdPointType
答案 1 :(得分:1)
template <typename real, size_t dimensions> class KdTree
{
public:
typedef KdPoint<real, dimensions> point_type;
}