我正在努力完成
namespace NTL
{
typedef std::valarray vector;
}
通过标准C ++。我知道这是不允许的,但我需要一种快速简便的方法(不需要重新实现所有函数,运算符,重载等)来获取模板typedef。
我现在正在做一个模板类Vector,它有一个valarray作为数据成员,但是这需要我为我的向量重载所有数学函数(再次......就像valarray一样)。
有什么想法吗?谢谢!
PS:我可能需要在某个时候扩展NTL::vector
的功能,并且将其纳入解决方案的方法非常棒。
答案 0 :(得分:8)
在C ++ 0x中,这将非常简单,但目前你可以通过两种方式解决问题,通过元函数或滥用继承。
namespace NTL {
// metafunction
template <typename T>
struct vector_1 {
typedef std::valarray<T> type;
};
// inheritance abuse:
template <typename T>
struct vector_2 : std::valarray<T>
{};
}
int main() {
NTL::vector_1<double>::type var1; // type is std::valarray<double>
NTL::vector_2<double> var2; // type inherits from std::valarray<double>
}
第二种方法可以很容易地扩展,但请注意,一般不建议从STL容器公开继承,因为它们不是为了扩展而设计的。特别是因为它们没有虚拟析构函数,如果你的对象从指向STL容器的指针delete
d,你最终会得到未定义的行为......
我建议你私下继承,并通过using
声明(优于提供公共继承)将基本成员函数纳入范围。它需要更多的样板代码,但您不需要为所需的所有接口提供转发方法。
namespace NTL {
template <typename T>
using vector = std::valarray<T>;
}
答案 1 :(得分:1)
您可以从NTL::vector
std::valarray
班级
namespace NTL {
template <class T>
class vector : public std::valarray<T>
{
public:
vector() : std::valarray<T>() { }
vector(const std::valarray<T>& other) : std::valarray(other) { }
/* other constructors to match the std::valarray constructors */
vector& operator=(const vector& );
vector& operator=(const std::valarray<T>& );
};
}
这样,NTL::vector
会在一系列操作开始时转换为std::valarray
,但生成的valarray也可以再次转换为NTL::vector
。
一个重要警告:由于stl::valarray
不是为多态使用而设计的,如果尝试通过NTL::vector
指针删除std::valarray
对象,则会遇到麻烦!