作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试根据由模板参数指定的 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-loop 迭代。其他的,如插值,需要一个单独的 2D 和 3D 函数。
非常感谢任何提示!
最佳答案
我会建议这个解决方案:
template <typename T, int d>
class Point : public Point<T, d-1>
{
typedef Point<T, d-1> base;
T m_value;
public:
T add()
{
return m_value + base::add();
}
//another method which returns you the point value
template<int N>
T get()
{
return N==d ? m_value : base::get<N>();
}
};
template <typename T>
class Point<T,0>
{
protected:
T add()
{
return T(); //default value which is zero for all builtin types
}
template<int N>
T get() { return T(); }
};
使用此解决方案,您可以拥有任意多的点,但大于 zero
.
Point<int,1> p1; //contains 1 point
Point<int,2> p2; //contains 2 points
Point<int,3> p3; //contains 3 points
Point<int,4> p4; //contains 4 points
Point<int,5> p5; //contains 5 points
auto x1 = p5.get<1>(); //get first point
auto x3 = p5.get<3>(); //get third point
auto x4 = p5.get<4>(); //get fourth point
或者为了方便使用这些 typedef:
typedef Point<int,2> Point2D;
typedef Point<int,3> Point3D;
//then use them
Point2D p2d;
Point3D p3d;
嗯,这只是一个可以进一步增强的基本想法,支持许多有用的功能。我刚写了get<>
演示一个似乎有用的功能。
关于C++ 模板 - 成员函数的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14097580/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!