我正在阅读一本教科书,并发现了一个关于模板的问题。
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;
}
很容易回答第一部分(使用模板重写..)但我对问题的第二句感到困惑。它试图说什么?
答案 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;
要使上述工作正常,需要有一个(复制/不移动)赋值运算符。
继续这种分析方式来完全回答这个问题。