2013-01-17

staticデータメンバーの明示的特殊化

規格によれば、クラステンプレートのstaticデータメンバーは明示的特殊化できるという。

template < typename T >
struct X
{
    static int data ;
} ;


// staticデータメンバーの定義
template < typename T >
int X<T>::data ;

// 明示的特殊化
template < >
int X<int>::data ;

なるほど、確かにできる。しかし、何の意味があるのだろう。staticデータメンバーの型を変えることは出来ない。

// エラー
template < >
float X<int>::data ;

また、以下のようなコードも動かない。

template < typename T >
struct X
{
    static T data ;
} ;


// staticデータメンバーの定義
template < typename T >
T X<T>::data ;

// 明示的特殊化
// エラー、void型はデータメンバーにできない。
// X<void>::dataの型はvoid
template < >
int X<void>::data ;

このようなコードは、staticデータメンバーの明示的特殊化ではなく、staticデータメンバーの定義の時点でメタ関数を使わなければならない。

template < typename T >
struct X
{
    static typename std::conditional< 
        std::is_same< T, void >::value,
        int, T >::type data ;
} ;


// staticデータメンバーの定義
template < typename T >
typename std::conditional< 
    std::is_same< T, void >::value,
    int, T >::type X<T>

クラステンプレートのstaticデータメンバーの明示的特殊化は、存在意義が謎だ。

追記:初期値を変えることができる。なるほど、たしかにそうだ。

staticデータメンバーの明示的特殊化の使い方? - C++でゲームプログラミング

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.