代码之家  ›  专栏  ›  技术社区  ›  rubenvb

typedef模板声明的替代方法

  •  4
  • rubenvb  · 技术社区  · 14 年前

    我正在努力完成

    namespace NTL
    {
        typedef std::valarray vector;
    }
    

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

    有什么想法吗?谢谢!

    PS:我可能需要扩展 NTL::vector 从某种意义上说,将其纳入解决方案的方法将是令人敬畏的。

    2 回复  |  直到 14 年前
        1
  •  8
  •   David Rodríguez - dribeas    14 年前

    在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

    我建议您私下继承,并通过 using

    namespace NTL {
       template <typename T>
       using vector = std::valarray<T>;
    }
    
        2
  •  1
  •   Bart van Ingen Schenau    14 年前

    你可以从 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::矢量 标准::VALARY 再一次。

    一个很大的警告:作为 stl::valarray 不是为多态使用而设计的,如果尝试删除 对象通过 标准::VALARY 指针!