我正在努力实现
namespace NTL
{
typedef std::valarray vector;
}
通过标准 C++。我知道这是不允许的,但我需要一种快速且简单的方法(无需重新实现所有函数、运算符、重载等)来获取模板 typedef。
我现在正在做一个模板类 Vector,它有一个 valarray 作为数据成员,但这需要我重载我的向量的所有数学函数(再次......因为 valarray 也这样做)。
有任何想法吗?谢谢!
PS:我可能需要扩展功能NTL::vector
在某些时候,将其合并到解决方案中的方法将会很棒。
在 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 容器公开继承,因为它们并不是为扩展而设计的。特别是因为它们没有虚拟析构函数,如果您的对象是delete
d 从指向 STL 容器的指针...
我建议您私有继承并通过以下方式将基本成员函数纳入范围:using
声明(比提供公共继承更好)。它将需要更多的样板代码,但您不需要为所有所需的接口提供转发方法。
顺便说一句,C++0x 的方式是:
namespace NTL {
template <typename T>
using vector = std::valarray<T>;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)