键入T的构造函数

时间:2014-08-16 21:13:30

标签: c++ templates types constructor

我正在Goodrich / Tamassia" Data Structures"书,我无法真正理解其中一个问题的含义: 这个问题要求实现一个模板化的C ++类" Vector" (类型T)表现得像STL" vector"具有以下扩展名:它应该支持加法,减法和乘法。这部分很简单,我知道如何制作一个操作员。问题还说"类型T应该有构造函数T(0) - 生成加性标识元素,而T(1) - 生成乘法标识元素。" 这是部分我不明白。如何为模板化类型T创建构造函数?它该怎么办?谢谢

Problem 2.3 of Data Structures and Algorithms in C++ by Goodrich/Tamassia

3 个答案:

答案 0 :(得分:3)

您无法为现有类型创建构造函数(如果类型是类,则不修改代码)。问题没有指明这一点,它(严重地)指出T应该拥有至少一个构造函数来获取值0和1。

基本上,这意味着T应该能够产生值0和1,因为(几乎)每个基本类型都能够。例如,int可以有0或1作为值。

修改
现在您已经添加了整个问题,我可以阅读我的预期:它指出T支持加法,减法和乘法。 “身份元素”部分不是很重要,它只是增加了某种正确性。如上所述,您的类应使用任何数字标量类型进行模板化。这是最基本的类型。

原创
然而,一个更彻底的问题会说明T应该支持加法,减法和乘法,因为Vector类本身就是为了支持这些(并且不需要特殊值,如0或1)。事实是,您很可能会使用intdouble这类基本类型的向量,因此您无需担心它。

因此,问题基本上表明您的T类型应该具有实现Vector的加法,减法和乘法所需的内容。你无事可做。

答案 1 :(得分:2)

对于类型T,产生附加标识的元素是T i,例如你采用的任何T j,保证j + i = j。

换句话说,类型T的等价值为0.在int的情况下为0,在双精度的情况下为0.0,在字符串的情况下为“”,在复杂的情况下为{0.0,0.0},等...

对于乘法身份i,原理是相同的。无论你采取什么样的T j都是T i,j * i = j。你可以猜测,对于int,它将是1,对于双1.0,等等......

我认为问题是T型应该有这样一个元素(假设)。所以你可以使用它。但它并没有说你必须定义它。

答案 2 :(得分:1)

根据我的拙见,有争议的引用规定T的可用上下文中class vector<T>的允许类型应支持加法和乘法的标识。

尽管如此,在类型特征的帮助下,尤其是std::enable_if,您可以创建class vector<T>,只有在T支持添加和乘法的标识时才会编译,如下例所示:

namespace detail {
  template<typename T, class Enable = void> class vector;

  template<typename T>
  class vector<T, typename std::enable_if<T(0) + T(1) == T(1) && T(1) * T(1) == T(1)>::type> {
    // ...
  };

  template<typename T, template<typename> class C>
  class vector<C<T>, typename std::enable_if<T(0) + T(1) == T(1) && T(1) * T(1) == T(1)>::type> {
    // ...
  };
}

LIVE DEMO