読者です 読者をやめる 読者になる 読者になる

gl5_progのメモ

自分のためのメモとかまとめとか

テンプレート引数を無視したフレンドクラス宣言

template<class> friend class A;

こう書くことでテンプレート引数の型に関係なくクラスAに対してフレンド宣言ができるそうです。

参考: http://d.hatena.ne.jp/Cryolite/20040602

おまけコード例 http://ideone.com/PSNuxi

#include <stdio.h>

class Madoka;
class Homura;
class Kyoko;
class Sayaka;
class Mami;

class Human{};

template<class T>
class MahouShoujo
{
    template<class> friend class MahouShoujo; // 魔法少女はみんな友達
    Human* m_pSoulGem;
public:
    MahouShoujo() : m_pSoulGem(new Human){}
    ~MahouShoujo(){ delete m_pSoulGem; }
    template<class U>
    Human* ThrowSoulGem( MahouShoujo<U>& m )
    {
        Human* p = m.m_pSoulGem;
        m.m_pSoulGem = 0;
        return p;
    }
};

int main( void )
{
    MahouShoujo<Sayaka> sayaka;
    MahouShoujo<Madoka> madoka;
    madoka.ThrowSoulGem( sayaka );
    printf( "(。。)今のはまずかった\n" );
    return 0;
}