我想了解这个程序是如何工作的。我是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;
}
答案 0 :(得分:1)
并不是真的需要运算符<<
,但在使用输出流时使用它很方便。此外,运算符需要访问Temp类的内部值,因此需要friend
限定符。没有它,类必须以某种方式将内部值val
暴露给外部世界(通常的方法是制作一个公共只读方法),这会产生维护问题,因为类的未来演变会必须继续支持该方法,即使班级内部变化。
换句话说,将<<
运算符声明为该类的朋友会阻止实现细节泄露给世界其他地方。
也就是说,T()运算符几乎提供了我上面描述的假设只读方法的服务,但是通过复制val
字段来替换只读部分。基本上,它是一个转换运算符,允许隐含地将Temp值转换为T值。可以使用该强制转换运算符实现<<
运算符,因此无需使用好友限定符。但是,当然为了提高效率,朋友限定符一直是为了避免复制val
的开销。
关于<<
运算符的实现,我们可以看到它依赖于为T类型名定义的相同运算符。任何定义了此运算符的类型都应该可以正常使用此模板。