rub*_*nvb 4 c++ templates stl typedef
我正在努力完成
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来自指向STL容器的指针,你最终会得到未定义的行为......
我建议你私下继承,并通过using声明(优于提供公共继承)将基本成员函数纳入范围.它需要更多的样板代码,但您不需要为所有需要的接口提供转发方法.
顺便说一句,C++ 0x的方式是:
namespace NTL {
   template <typename T>
   using vector = std::valarray<T>;
}
| 归档时间: | 
 | 
| 查看次数: | 3802 次 | 
| 最近记录: |