1
  1. C++ で「トランスペアレント クラス ラッパー」と呼ばれるもの
  2. 「透明…」と呼ばれる理由
  3. それの用途は何ですか(「透過クラスラッパー」なしではできないこと)。

いくつかの概念的な説明に感謝します。

4

2 に答える 2

4

透過クラス ラッパーは、型の周りのラッパーであり、ラッパーは基になる型と同じように動作するため、"透過的" です。

intそれとその使用法を説明するために、 but オーバーロードをラップして、使用されるたびにメッセージを出力する例を次に示します(このスレッドoperator++()に触発されました):

class IntWrapper {
    int data;
public:
    IntWrapper& operator++() {
        std::cout << "++IntWrapper\n";
        data++;
        return *this;
    }

    IntWrapper(int i) : data(i) {}

    IntWrapper& operator=(const IntWrapper& other)
    {
        data = other.data;
        return *this;
    }

    bool operator<(const IntWrapper& rhs) const { return data < rhs.data; }

    // ... other overloads ...
};

次に、次のことを選択した場合、int使用箇所を に置き換えることができます。IntWrapper

for (int i = 0; i < 100; ++i) { /* ... */ }
// becomes
for (IntWrapper i = 0; i < 100; ++i) { /* ... */ }

後者を除いて、プリインクリメントが呼び出されるたびにメッセージが出力されます。

非明示的なコンストラクターを指定したことに注意してくださいIntWrapper(int i)intこれにより、 が期待される場所IntWrapper( など)を使用するたびにIntWrapper i = 0、コンパイラはコンストラクターを暗黙のIntWrapperうちに使用して、int. Google C++ スタイル ガイドは、まさにこの理由から、単一引数の非明示的なコンストラクターを思いとどまらせています。一方、これは透過的なクラス ラッパーにまさに必要なことです。なぜなら、2 つの型を簡単に変換できるようにする必要があるからです。

あれは:

// ...
explicit IntWrapper(int i) ...
// ...
IntWrapper i = 0;   // this will now cause a compile error
于 2013-05-07T04:38:19.910 に答える
0

ほとんどの場合、軽量のインライン (ヘッダー ファイル) ラッパー クラスを指していますが、私はこの用語に慣れていません。このような抽象化のレベルを追加すると、一般的なクライアント コードを許可するのに役立ちます。

于 2013-05-07T03:51:46.417 に答える