「テンプレートクラスと友元」のこと(C++)


テンプレートクラスは、クラステンプレートがインスタンス化されたクラスであり、友元は関数へのアクセス権限の制御であり、関数を友元関数に設定することで、他の外部関数にアクセスできない「private」メンバー変数にアクセスできるようにします.
次に、彼らが結合するとどのような結果が得られるかを紹介します.彼らの結合は3つの状況に分けられます.
1、テンプレートクラスの非テンプレート友元関数
この友元関数の特徴は次のとおりです.
A)この友元関数がクラステンプレートのメンバー変数を使用しない場合、一般的な友元関数と区別しない:
B)この友元関数がクラステンプレートのメンバー変数を使用する場合、showやshowなどの基本タイプごとに友元関数を定義する必要がある.この2つは関数の再定義ではなく、関数の再ロードに属します.
テストコードは次のとおりです.
template
class Base{
public:
    Base(T x, T y): x(x), y(y){}
    friend void print();
    friend void show(Base &a);
private:
    T x;
    T y;
};
void show(Base &a)
{
    cout < &a)
{
     cout < ai(99, 999);
    Base ad(99.99, 200.88);
    print();
    show(ai);
    show(ad);
    return 0;
}

2、テンプレートクラスの拘束友元関数
この友元関数の特徴は、各クラスの具体化が友元の具体化と一致することである.すなわち、intクラスの具体化はintクラスの友元関数を獲得し、doubleクラスは具体化してdouble関数を獲得し、intクラスの具体化はdoubleクラス関数を得ることができない.
コンストレイントテンプレートのメタ関数を定義するには、次の手順に従います.
A)クラスを定義する前に、友元関数テンプレートを宣言する.
B)この友元関数テンプレートをクラスに宣言する.
C)友元関数を定義し、
なお、メタ関数を定義する際のパラメータリストの「T」は、クラスのテンプレートパラメータではなく、クラスを具体化した後のクラスを表し、すなわち、テンプレートクラス「A」、「T」は「A」を表し、「int」ではない.このようにして、そのメタ関数が特定化された後のテンプレートに属することを制約する.
templatevoid print(); //    :            
templatevoid show(T &t);
 
template
class Base{
public:
    Base(T x, T y): x(x), y(y){}
    friend void print();  //    :           
    friend void show<>(Base& a);
private:
    T x;
    T y;
};
//   :      
void print()
{
    cout <
void show(T &a)  //    T           
{
    cout < a(99, 999);
    print();
    show(a);
    return 0;
}

3、テンプレートクラスの非拘束友元関数
この友元関数の特徴は、制約友元関数とは逆です.つまり、各クラスの具体化は各関数の具体化を得ます.intクラスを具体化すれば、double、string、intなどのクラスの友元関数を得ることができます.
template
class Base{
public:
    Base(T x, T y): x(x), y(y){}
    template
    friend void print(Base &obj);
private:
    T x;
    T y;
};
template
void print(Base &obj){
    cout < a(99, 999);
    print(a);
    return 0;
}