我正在学习模板并遇到了功能模板。我已经根据我的创造力或好奇心开发了以下代码。
#include<iostream>
using namespace std;
template <typename type>
type Max(type a, type b)
{
return a > b ? a : b;
}
class Foo
{
public:
string s1;
/*
Foo& operator>(Foo &obj)
{
if (this->s1.length() > obj.s1.length() ? true : false)
return *this;
return obj;
}*/
};
int main()
{
cout << Max(2, 3) << endl;
cout << Max(2.0, 3.0) << endl;
Foo a, b;
a.s1 = "AB";
b.s1 = "ABC";
//cout<<Max(a, b).s1;
}
我的想法是使用Max函数模板传递Foo对象a和b并重载&#39;&gt;&#39; 运算符并使用更大的字符串打印对象的字符串长度。 我是在正确的道路上吗?还是应该与班级模板相关?
答案 0 :(得分:2)
让operator>
返回bool
,否则它无法与return a > b ? a : b;
一起使用。
bool operator>(const Foo &obj)
{
return this->s1.length() > obj.s1.length();
}
BTW1:if (this->s1.length() > obj.s1.length() ? true : false)
是多余的
BTW2:最好将参数类型设为const
,因为obj
不会也不需要修改。
答案 1 :(得分:2)
您走在正确的道路上,但>
运算符应采用const
引用参数,本身为const
类方法,并返回bool
:
bool operator>(const Foo &obj) const;
毕竟,你期望>
的结果与其他任何东西相比,例如:
double a, b;
// ...
auto whatisthis= a > b;
您希望whatisthis
成为double
吗?当然不是,它将是bool
。任何比较运算符的结果,不仅>
应该是bool
。它实际上并非如此,您可以重载>
运算符并让它返回任何内容;但这意味着你无法按照预期的方式使用它。
答案 2 :(得分:2)
您的问题的答案是&#34;是的,您已走上正轨。&#34;
泛型函数的问题是有效地使用它们。您的Max()
功能有效,但它会在整个地方复制对象。
template <typename type>
const type &Max(const type &a, const type &b)
{
return a > b ? a : b;
}
这解决了对象复制问题 - 但现在它对int
等问题的效率较低。
答案 3 :(得分:0)
#include <iostream>
using namespace std;
template <typename type>
type Max(type a, type b)
{
return a > b ? a : b;
}
class Foo {
public:
string s1;
bool operator > (Foo &obj) {
return this->s1.length() > obj.s1.length();
}
};
int main()
{
cout << Max(2, 3) << endl;
cout << Max(2.0, 3.0) << endl;
Foo a, b;
a.s1 = "AB";
b.s1 = "ABC";
cout << Max(a, b).s1;
}
这可能是你想要的: