0

我试图了解这个程序是如何工作的。我是 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;
}
4

1 回答 1

1

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

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

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

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

于 2012-11-08T00:41:09.500 回答