从递归模板类继承
Inheritance from recursive template class
由于递归模板,我正在尝试实现某种多维数组。
我的模板类具有以下结构:
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
定义。如果你想要特定的行为,你可以使用静态帮助程序类函数,在那里你专门化每种数据类型的运算符的行为。
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 带有递归继承和使用声明的Variadic模板
- 用类型的递归继承获得Variadic模板的阴影成员
- 通过类型C++ 的继承树递归导致此指针问题
- 具有可变模板的递归继承和继承参数问题
- 使用可变参数模板的递归继承
- 为什么对std::tuple实现使用递归继承不好
- 从递归模板类继承
- 从递归定义的类继承
- 具有合成和继承属性的深度递归qi语法(解析器)