c ++模板和重载运算符

时间:2012-11-08 00:17:59

标签: c++ templates operators

我想了解这个程序是如何工作的。我是c ++模板的新手。 有人可以解释为什么我们需要以下功能吗?

friend std::ostream &operator <<(std::ostream &os, const Temp &temp)

它似乎仅适用于字符串模板。

此外,函数operator T() {return val;}做了什么?

#include <iostream>
#include<string>

template <typename T>
class Temp {        
    friend std::ostream &operator <<(std::ostream &os, const Temp &temp) {
    os << temp.val;
    return os;
    }

public:
    Temp(T val) : val(val) {}
    operator T() {return val;}
public:
    T val;
};

用法示例:

#include <iostream>
#include<string>

#include "temp2.h"

using namespace std;

int main() {
    temp<int> si = 10;
    cout << "si: " << si << endl;
    si = si + 2;
    cout << "After si = si + 2: " << si << endl;

    Temp<double> si2 = 15.5;
    cout << "si: " << si2 << endl;
    si2 = si2 + 2.3;
    cout << "After si = si + 2: " << si2 << endl;

    Temp<string> ss = string("Hello");
    cout << "ss: " << ss << endl;
    ss = string(ss).substr(1);
    cout << "After ss = si.substr(1): " << ss << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

并不是真的需要运算符<<,但在使用输出流时使用它很方便。此外,运算符需要访问Temp类的内部值,因此需要friend限定符。没有它,类必须以某种方式将内部值val暴露给外部世界(通常的方法是制作一个公共只读方法),这会产生维护问题,因为类的未来演变会必须继续支持该方法,即使班级内部变化。

换句话说,将<<运算符声明为该类的朋友会阻止实现细节泄露给世界其他地方。

也就是说,T()运算符几乎提供了我上面描述的假设只读方法的服务,但是通过复制val字段来替换只读部分。基本上,它是一个转换运算符,允许隐含地将Temp值转换为T值。可以使用该强制转换运算符实现<<运算符,因此无需使用好友限定符。但是,当然为了提高效率,朋友限定符一直是为了避免复制val的开销。

关于<<运算符的实现,我们可以看到它依赖于为T类型名定义的相同运算符。任何定义了此运算符的类型都应该可以正常使用此模板。