C++ で次の状況を考えてみましょう。
template<int n>
class Base { ... };
class Derived3 : public Base<3> {
// a complicated body, making use of n=3
};
class Derived7 : public Base<7> {
// a completely different body, making use of n=7
};
メンバー関数の内部では、数値をハードコーディングせずに明示的に , と , をDerived3
使用したいと思います。つまり、テンプレート引数のようなものを引き続き参照します。次のオプションが頭に浮かびます。n=3
Derived7
n=7
n
また、 で派生クラスをテンプレート化し
n
、 を使用しtypedef
ます。このようにして、派生クラスは次のことを認識しn
ます。template<int n> class DerivedTemplate3 : public Base<n> { ... }; typedef DerivedTemplate3<3> Derived3; template<int n> class DerivedTemplate7 : public Base<n> { ... }; typedef DerivedTemplate7<7> Derived7;
これの問題は、それ
DerivedTemplateX
が にしか意味をなさないことですn=X
。そのため、これはテンプレート パラダイムを悪用しているように感じます。static const メンバーを使用して に格納
n
しBase
、派生クラスでそれを参照します。template<int n> class Base { protected: static const int nn = n; ... }; class Derived3 : public Base<3> { // refer to nn=3 }; class Derived7 : public Base<7> { // refer to nn=7 };
ここでの問題は、同じ識別子 (
nn
vs.n
) を使用できないように見えることです。nn
また、これが派生クラスのメンバーのテンプレート引数として使用できるかどうかもわかりません。
では、これを非冗長で効率的な方法で実装するにはどうすればよいでしょうか? たぶんstatic const int
、どこかのメンバーとして何かを使用していますか?