規格によれば、クラステンプレートの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データメンバーの明示的特殊化は、存在意義が謎だ。
追記:初期値を変えることができる。なるほど、たしかにそうだ。
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.