C++ 模板 - 成员函数的部分特化

标签 c++ class templates inheritance specialization

我正在尝试根据由模板参数指定的 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/

相关文章:

c++ - 对于完整的 c 和 c++ 编译器,我应该在 MinGW 设置中选择哪些选项

c++ - 本地构建工作正常时没有这样的文件或目录

java : "Class Overloading"

python - Python 的模板系统或语言(主要是 HTML)

c++ - 如何在同一个主文件中转发声明模板类,如模板函数

c++ - 设置 mlpack 时找不到 <execinfo.h>

c++ - libevent bufferevent 的 evbuffer_add

c++ - 将不同的参数传递给重载的运算符函数

c++ - 使用常量变量作为数组的大小

c++ - 如何typedef一个内部类