由于递归模板,我正在尝试实现某种多维数组。
我的模板类具有以下结构:
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
,对于 double 数组,将MultiArrayDouble
替换为operator+=
。但是我不能写出确切的子数组类型(看“???”)…是否有针对此问题的标准解决方案?我应该避免从递归模板类继承吗?
谢谢。
编辑:
operator[](unsigned int i)
的实现: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);
}
笔记:
VecSubarrays[i]
返回第i个子数组,即MultiArray< T, 0 >
; T&
到ojit_code的隐式转换。 最佳答案
我宁愿使用模板规范机制,而不是从MultiArryDouble
继承的特定类MultiArray
。指定MultiArray<double, D>
将是更好的方法。
缺点之一是您必须重复整个类(class)。
为什么不在operator+=
中定义MultiArray
?这样,将为定义了T
的每个operator+=
定义它。并且,如果您想要特定的行为,则可以使用静态帮助器类函数,在该函数中,您可以针对每种数据类型专门化运算符的行为。