c++模板-成员函数的部分专门化
C++ templates - partial specialisation of member function
我试图根据模板参数指定的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函数。
任何提示非常感谢!
我建议这样做:
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 Point<int,2> Point2D;
typedef Point<int,3> Point3D;
//then use them
Point2D p2d;
Point3D p3d;
这只是一个基本的想法,可以进一步增强,支持许多有用的功能。我写get<>
只是为了演示一个似乎很有用的功能。
您的示例可能是这样工作的。首先声明主模板:
template <typename T, int d> class Point;
没有必要定义它,因为你没有一个通用的实现。
接下来,您将为不同数量的维度创建部分专门化,但是您的部分专门化仍然将类型T作为模板参数:
template <typename T>
class Point<T,2>
{
public:
T x;
T y;
T add()
{
return x + y;
}
};
template <typename T>
class Point<T,3>
{
public:
T x;
T y;
T z;
T add()
{
return x + y + z;
}
};
相关文章:
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 专门化模板覆盖函数/避免对象切片
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 如何在编译时专门化大型模板函数中的小部分
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 使用decltype尾部返回类型专门化函数模板
- 为模板化派生类专门化函数模板
- C++模板-专门化函数
- 在单独的.cpp文件中专门化函数模板
- 创建专门化函数模板的最佳方法是什么?
- 用泛型返回类型专门化函数
- 可以将运行时确定的模板参数传递给专门化函数吗?
- 根据调用方/上下文专门化函数的行为
- 专门化函数从其他函数调用
- c++中专门化函数模板的语法
- c++对枚举的专门化函数