Seasons.NET

ちょっとした技術ブログです

Modern C++ Design勉強日記 クラステンプレートの特殊化は、パターンマッチのようにつかえる

#include "stdafx.h"

using namespace std;

// Widget
class Widget
{
};

// Widget2
class Widget2
{
};

/*------------------------------------------------------------------------- */
/* (1)                                                                      */
/*------------------------------------------------------------------------- */
template <typename T , typename U>
class Hoge : public U
{
    public:
        Hoge()
        {
            cout << "Hoge0" << endl;
        }
};

/*------------------------------------------------------------------------- */
/* (2)                                                                      */
/*------------------------------------------------------------------------- */
// 部分的に特殊化した場合は、Hogeの後にマッチさせたいパターンを書くわけ。
// 特殊化させたら、該当するテンプレート引数を消す
template <typename T>
class Hoge<T, Widget> : public Widget 
{
    public:
        Hoge()
        {
            cout << "Hoge1" << endl;
        }
};

#ifdef __TEST_TMP4_1
AUTO_TEST( tmp4_1 )
{
    Hoge<int    , Widget>  h1; //=> テンプレート引数2がWidgetなので、(2)に一致する
    Hoge<Widget , Widget2> h2; //=> (2)に一致しないので、(1)に一致する
}
#endif

template<bool T>
class Base
{
};

template<>
class Base<false>
{
public:
    Base()
    {
        cout << "false" << endl;
    }
};

template<>
class Base<true>
{
public:
    Base()
    {
        cout << "true" << endl;
    }
};

template< bool T >
class Inherit : public Base< T >
{
public:
    Inherit()
    {
        cout << "Base" << endl;
    }
};

#ifdef __TEST_TMP4_2
AUTO_TEST( tmp4_2 )
{
    Inherit< true > num; // true , falseで基底クラスを切り替える
}
#endif