从递归模板类继承

Inheritance from recursive template class

本文关键字:继承 递归      更新时间:2023-10-16

由于递归模板,我正在尝试实现某种多维数组。

我的模板类具有以下结构:

template< typename T, unsigned int D >
class MultiArray
{
public:
    MultiArray();
protected:
    std::vector< MultiArray< T, D - 1 > > VecSubarrays;
};
template< typename T >
class MultiArray< T, 0 >
{
public:
    MultiArray();
protected:
    T Item;
};

带有一些访问器、修饰符等。

我想用T = double"专门化"这个模板类,并添加一些特定的功能,如运算符重载(+,-,+=,-=(。

所以我创建了这个模板类:

template< unsigned int D >
class MultiArrayDouble: public MultiArray< double, D >
{
public:
    MultiArrayDouble();
    template< unsigned int E >
        MultiArrayDouble< D >& operator+=(MultiArrayDouble< E > const& A_MAD);
    MultiArrayDouble< D >& operator+=(MultiArrayDouble< 0 > const& A_MAD);
};

我重载operator+=的地方(编辑:见下面的实现(。

但是这种结构没有我期望的行为。我相信MultiArrayDouble< D >对象的子数组只是MultiArrayDouble< D - 1 >.但是我operator+=递归编码,编译器说:

error: no match for 'operator+=' (operand types are 'MultiArray<double, 1u>' and 'const MultiArray<double, 1u>')

事实上,MultiArrayDouble< D >对象的子数组是MultiArray< double, D - 1 >的,其中operator+=没有重载。

我想我可以用一些从MultiArray< double, D >MultiArrayDouble< D >的演员来处理这个问题,但我正在寻找一个优雅的解决方案。

我想我可以将子数组类型指定为模板参数,如下所示:

template< typename T, unsigned int D, template< typename, unsigned int, typename > typename U >
class MultiArray
{
public:
    MultiArray();
protected:
    std::vector< U< T, D - 1, ??? > > VecSubarrays;
};

对于常规数组,将U替换为 MultiArray,对于双数组,则替换为 MultiArrayDouble。但是我无法编写确切的子数组类型(查看"???"(。

这个问题有标准的解决方案吗?我应该避免从递归模板类继承吗?

谢谢。

编辑

实施operator+=

template< unsigned int D >
template< unsigned int E >
MultiArrayDouble< D >& MultiArrayDouble< D >::operator+=(MultiArrayDouble< E > const& A_MAD)
{
    for (unsigned int i = 0 ; i < this->Length() ; i++)
    {
        (*this)[i] += A_MAD[i];
    }
    return (*this);
}
template< unsigned int D >
MultiArrayDouble< D >& MultiArrayDouble< D >::operator+=(MultiArrayDouble< 0 > const& A_MAD)
{
    for (unsigned int i = 0 ; i < this->Length() ; i++)
    {
        (*this)[i] += A_MAD;
    }
    return (*this);
}
template<  >
MultiArrayDouble< 0 >& MultiArrayDouble< 0 >::operator+=(MultiArrayDouble< 0 > const& A_MAD)
{
    (*this) += A_MAD;
    return (*this);
}

笔记:

  • 运算符operator[](unsigned int i)返回第 i 个子数组,即 VecSubarrays[i] ;
  • 我已经实现了从MultiArray< T, 0 >T&的隐式强制转换。
而不是从

MultiArray继承的特定类MultiArryDouble,我宁愿使用模板规范机制。指定MultiArray<double, D>将是一种更好的方法。

一个缺点是您必须重复整个课程。

为什么不在MultiArray中定义operator+=?这样,它将为定义operator+=的每个T定义。如果你想要特定的行为,你可以使用静态帮助程序类函数,在那里你专门化每种数据类型的运算符的行为。