功能模板与运算符重载

时间:2016-06-12 02:53:26

标签: c++ templates

我正在学习模板并遇到了功能模板。我已经根据我的创造力或好奇心开发了以下代码。

#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; 运算符并使用更大的字符串打印对象的字符串长度。 我是在正确的道路上吗?还是应该与班级模板相关?

4 个答案:

答案 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;
}

这可能是你想要的:output results