C 模板和过载操作员

c++ templates and overloading operators

本文关键字:操作员      更新时间:2023-10-16

我正在尝试了解该程序的工作原理。我是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;
}

并不是真的需要操作员<<,而是在使用输出流时很方便使用它。此外,操作员需要访问温度类的内部值,因此friend预选赛。没有它,班级将必须以某种方式将内部价值val暴露于外部世界(通常的方法是仅公开阅读方法),这会引起维护问题,因为该类的未来演变必须继续支持该方法,即使类内部变化。

换句话说,将<<操作员声明为"同类"的朋友,可以防止实现详细信息泄漏到世界其他地方。

也就是说,t()运算符几乎提供了我上面描述的仅假设读取方法的服务,但是通过复制val字段来替换读取部分。基本上,这是一个铸件运算符,允许将温度值施加到t值。<<操作员本可以使用该铸造运算符实施,因此无需朋友预选赛。但是,当然,出于效率问题,保留了朋友预选赛,以避免复制val的开销。

关于<<运算符的实现,我们可以看到它依赖于针对t打字机定义的相同操作员。任何具有此操作员定义的类型都应使用此模板而无问题。