C++テンプレートは型を引数として取ることでよく知られていますが、他の型のデータに対してもパラメータ化できます。
template <typename T, unsigned int N> class Array {
private:
T array[N];
public:
/* ... */
};
テンプレートはまた、例えば(限り、ポインタが一定の基準を満たしているとして、ポインタを介してパラメータ化することができ、それがアドレスに評価することがあります。ここに示すようにたとえば、あなたは、整数上のクラスをテンプレート化できコンパイル時に決めることのできるもの)。たとえば、これは完全に合法である:あなたのコードで
template <int* Pointer> class ThisIsLegal {
public:
void doSomething() {
*Pointer = 137;
}
};
、テンプレートはへのポインタ、クラスメンバーオーバーパラメータ化されています。クラスへのポインタは、オブジェクトを間接的に参照する点でポインタに似ています。しかし、オブジェクトを指す代わりに、クラス内のフィールドを指します。そのアイデアは、クラスからそのフィールドを選択するために、あるオブジェクトに関連したクラスへのポインタを参照解除することができるということです。ここでは、ポインタ・ツー・クラス・メンバーの簡単な例です:ポインタ・ツー・クラス・メンバを宣言する構文は、上記のコードでそう
Type ContainingClass::* pointerName;
、int MyStruct::* ptr
手段であること
struct MyStruct {
int x, y;
};
int main() {
MyStruct ms;
ms.x = 137;
ms.y = 42;
int MyStruct::* ptr; // Declare a pointer to a class member.
ptr = &MyStruct::x; // Now points to the field 'x'
ms.*ptr = 0; // Set the 'x' field of ms to be zero.
}
お知らせ。「あなたが投稿したコードでMyStruct
クラス
のint
内部へのポインタは、テンプレート宣言は次のように読み取ります
template <
class PropObject,
class PropType,
PropType PropObject::* Prop
>
class PropReader
これがどういう意味かを見てみましょう。プロパティを読み込む最初の2つのテンプレート引数オブジェクト、およびそのプロパティの型であるPropType
"テンプレートの最後の引数は、という名前のクラスへのポインタで、PropObject
のフィールドを指します。タイプPropType
たとえば、あなたがこのようなMyStruct
でこのテンプレートをインスタンス化できます。
PropReader<MyStruct, int, &MyStruct::x> myPropReader;
さて、残りのコードが何をするか見てみましょう。このクラステンプレートの本体はここに転載されています
void print(Object& o)
{
PropObject& po = static_cast<PropObject &>(o);
PropType& t = po.*Prop;
cout << t << "\n";
}
これはかなり簡単に読み取ることができます。この関数への参照は、o
という名前のObject
への参照であり、最後の行はいくつかのフィールドを出力します。これらの2行はトリッキーです:
PropObject& po = static_cast<PropObject &>(o);
PropType& t = po.*Prop;
この最初の行は、アイデア「タイプPropObject
の参照に引数o
をキャストしようと言って型キャストである私は推測している、Object
は、いくつかの基本クラスであるということです。関数へのパラメータは普通のObject
であり、このキャストはそれを適切な型のものに変換しようとします(PropObject
はオブジェクトの型を示すテンプレート引数です)。これはstatic_cast
を使用し、変換が定義されていない場合(たとえば、int
またはvector<string>
のテンプレートをインスタンス化しようとした場合)、コードはコンパイルされません。 eでは、コードはキャストが安全であることを信頼し、パラメータの参照先のタイプPropObject
の参照を取得します。
最後に、最後の行は
PropType& t = po.*Prop;
ですこれは、フィールドを選択する「と言って、私は前述のポインタとクラスメンバーの逆参照の構文を使用して店舗、その後、Prop
(テンプレート引数)が指しますその参照先はt
です。
だから、要するに、テンプレート
- は、いくつかのオブジェクトの種類をお願い致します。
- そのオブジェクトのいくつかのフィールドのタイプについて問い合わせます。
- そのオブジェクトのフィールドへのポインタを要求します。
- 与えられたオブジェクトがそのフィールドを印刷しようとすると、
print
関数を提供します。
Whew!それはやっかいだった!お役に立てれば!
これはすばらしい答えtemplatetypedef ..あなたがそのユーザー名を持っているのも不思議ではありません:) – cgcoder