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 に答える