假设类模板参数

时间:2012-11-17 12:50:26

标签: c++ templates

我有一个Kd-Tree实现,它被模板化以接受任何大于0的维度和任何浮点类型(float,double等等)。像这样:

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

我有一个伴随的“点”类型,它具有完全相同的模板布局。但是,此点类型需要可以从kd-tree类外部访问。现在,每次我需要在我的kd-tree代码中创建临时点时,我需要明确地去KdPoint<real, dimensions>,这是令人厌倦的,使我的行很长,并且没有为代码添加任何值。

有什么方法可以告诉编译器隐式假设realdimensions的值也被传递给了类的类?在某种程度上将两个模板列表链接在一起。这样我就可以输入KdPoint,编译器将根据类接收的模板参数直接知道放在那里的内容。

否则我需要使用宏来明确地将后者扩展为前者,这种情况很糟糕。

2 个答案:

答案 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;
}