っていうか上のヤツ書いてて気が付いたけれど,簡単なクラスで静的メンバが1つ2つぽつんとあるような場合,今まではその静的メンバの定義のためだけにわざわざヘッダと実装を分けないといけなくてうっとうしいなあと思っていたけれど,上のを応用すると,テンプレートが本来必要ないのにわざと静的メンバを持ったテンプレートクラスを実装して,ヘッダにそいつらの initializer template 書くことによって,ヘッダ include するだけ,実装ファイルのコンパイルもリンクも要らずにウマー,っていうことができるんちゃいます?知らんけど.
// hoge.hpp template< class T > class static_data_member_initializer { public: static double const pi; }; // initializer template (注:規格で定義されてる厳密な呼び方ではない) // 異なる翻訳単位で複数回出てきても O.K. template< class T > double const static_data_member_initializer< T >::d = 3.141592653589793; // ヘッダオンリー(ODR 違反なし)で静的メンバ pi が初期化されてうまままままー class MyClass : public static_data_member_initializer< void > // テンプレート引数は何でもよし { };
いや,つーか手前さしすせ味噌だけれど,これ微妙にすごくね?
#あ〜,でも const な静的データメンバだとインライン関数,非 const な静的データメンバだと関数内静的変数 + それの参照を返すインライン関数っつー代替手段があるから,めちゃくちゃウマーとまではいえにゃいかにゃ〜.