替代typedef的模板声明

时间:2010-09-14 11:54:03

标签: c++ templates stl typedef

我正在努力完成

namespace NTL
{
    typedef std::valarray vector;
}

通过标准C ++。我知道这是不允许的,但我需要一种快速简便的方法(不需要重新实现所有函数,运算符,重载等)来获取模板typedef。

我现在正在做一个模板类Vector,它有一个valarray作为数据成员,但是这需要我为我的向量重载所有数学函数(再次......就像valarray一样)。

有什么想法吗?谢谢!

PS:我可能需要在某个时候扩展NTL::vector的功能,并且将其纳入解决方案的方法非常棒。

2 个答案:

答案 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声明(优于提供公共继承)将基本成员函数纳入范围。它需要更多的样板代码,但您不需要为所需的所有接口提供转发方法。

顺便说一下,C ++ 0x的方式是:

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对象,则会遇到麻烦!