功能模板和操作

时间:2018-01-07 03:36:45

标签: c++

我正在阅读一本教科书,并发现了一个关于模板的问题。

Q值。使用模板重写此函数以使用任何类型。 列出使用此模板函数的任何类型必须支持的操作

int FindLargest(const int& a, const int& b) {
   int ret;
   if (a > b) {
      ret = a;
   }
   else {
      ret = b;
   }
   return ret;
}

我的回答:

template<typename T>
T FindLargest(const T& a, const T& b) {
   T ret;
   if (a > b) {
      ret = a;
   }
   else {
      ret = b;
   }
   return ret;
}

很容易回答第一部分(使用模板重写..)但我对问题的第二句感到困惑。它试图说什么?

2 个答案:

答案 0 :(得分:2)

  

列出使用此模板功能的任何类型必须支持的操作

这部分问题是询问人们称之为类型约束概念的泛型编程。

让我们来看看这一行:

if (a > b) {

此行正在使用运算符a比较b>。这意味着类型T必须支持>比较。否则,代码无法编译。

作为一个快速实验,您可以尝试声明一个空类并使用它来实例化函数模板。

class Empty {};

int main() {
    Empty x, y;
    FindLargest(x, y);
}

编译器可能会发出错误消息,如:

  

错误:不匹配&#39;运算符&gt;&#39; (操作数类型是&#39; const空&#39;和&#39; const空&#39;)

因此,列表中的几个项目之一应该是使用>大于比较操作。另请注意,此功能模板还需要其他操作。我会留给你找出来。

答案 1 :(得分:0)

2)问你T类型需要做哪些事情才能使模板正确编译和运行......

考虑:

T ret;

要使上述工作正常,T必须具有默认构造函数。

if (a > b) {

为了使上述工作,必须有一些>运算符,它可以 - 直接或间接地 - 比较该类型的两个实例,返回一个布尔类型的东西,或者可以转换为它。 直接支持的两个最明显的例子是bool T::operator>(const T& rhs) const成员函数或独立bool operator>(const T& lhs, const T& rhs)函数。 间接支持的一个示例是T::operator sometype () const转换运算符到类型 - 例如double - 它本身可以是与>进行比较。

  ret = a;

要使上述工作正常,需要有一个(复制/不移动)赋值运算符。

继续这种分析方式来完全回答这个问题。