- C++ で「トランスペアレント クラス ラッパー」と呼ばれるもの
- 「透明…」と呼ばれる理由
- それの用途は何ですか(「透過クラスラッパー」なしではできないこと)。
いくつかの概念的な説明に感謝します。
いくつかの概念的な説明に感謝します。
透過クラス ラッパーは、型の周りのラッパーであり、ラッパーは基になる型と同じように動作するため、"透過的" です。
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
ほとんどの場合、軽量のインライン (ヘッダー ファイル) ラッパー クラスを指していますが、私はこの用語に慣れていません。このような抽象化のレベルを追加すると、一般的なクライアント コードを許可するのに役立ちます。