【发布时间】:2012-12-15 09:01:06
【问题描述】:
我正在尝试根据模板参数指定的 2D 或 3D 专门化一些几何函数。最好为问题的玩具版本包含一些(非常损坏的)代码:
template <typename T, int d>
class Point
{
public:
int x;
int y;
int z;
T add ()
{
return T(0);
}
template <>
T add <T, 2> ()
{
return x + y;
}
template <>
T add <T, 3> ()
{
return x + y + z;
}
};
这段代码编译失败。我已经尝试了很多不同的模板参数格式和类定义的组合,但找不到一种方法来对 'd' 进行函数专业化,同时保留 'T' 通用。
在我的实际解决方案中,我尝试计算梯度、曲率、插值等,专门用于 2D 或 3D 案例。有些事情,比如梯度计算,可以简单地使用 'd' 参数来限制 for 循环迭代。其他的,比如插值,需要单独的 2D 和 3D 函数。
非常感谢任何提示!
【问题讨论】:
-
模板参数
T是干什么用的?它应该是您坐标的类型吗?如果是这样,为什么将 x,y,z 声明为int而不是T类型? -
只是为了澄清这一点:没有“模板专业化”之类的东西,您想要的是“模板重载”。
-
@Vaughn:这个简单的玩具问题源于我需要一个 2D 或 3D 网格,它可以在每个网格点包含任意类型(尽管通常只是 int、float 或 double)。因此 x,y(,z) 作为坐标,T 作为该坐标处的值类型。
标签: c++ class templates inheritance specialization