現: 2016-10-05 (水) 22:37:59 takatsuka[3] [4] | |||
---|---|---|---|
Line 1: | Line 1: | ||
+ | C++ は(も)使い続けてないと(使い続けていても)書式を忘れてしまいます。・・老化かな・・。 | ||
+ | というわけで、template クラスの中の template クラスの static 変数の実体や関数の中身を別に記述するとき、どうやって書くんだったっけ・・と悩んだ時のためにリファレンスコードとして残しておきます。 | ||
+ | #prettify{{ | ||
+ | |||
+ | // ↓いくらネストしてようと定義するだけは難しいことなく書ける。 | ||
+ | |||
+ | template <typename TA> struct ClassA | ||
+ | { | ||
+ | template <typename TB> struct ClassB | ||
+ | { | ||
+ | static const TB id; | ||
+ | template <int TC> struct ClassC | ||
+ | { | ||
+ | static int Func(); | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | // ↑のようなネストした定義の実体の書き方は以下↓。これが出てこなくて毎度躓く。 | ||
+ | |||
+ | template <typename TA> template<typename TB> const TB ClassA<TA>::ClassB<TB>::id = 999; | ||
+ | |||
+ | template <typename TA> template<typename TB> template<int TC> int ClassA<TA>::ClassB<TB>::ClassC<TC>::Func() | ||
+ | { | ||
+ | return TC * TC; | ||
+ | } | ||
+ | |||
+ | // で、使う場合はこんな感じ↓で難しいことなく書ける。 | ||
+ | |||
+ | void Func() | ||
+ | { | ||
+ | long i = ClassA<int>::ClassB<long>::id; | ||
+ | int n = ClassA<double>::ClassB<float>::ClassC<1>::Func(); | ||
+ | } | ||
+ | }} | ||
+ | |||
+ | 以上、だいぶ以前に書いたブログの記事を引っ張ってきました。 |
(This host) = https://thinkridge.com