3

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=3Derived7n=7n

  1. また、 で派生クラスをテンプレート化し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。そのため、これはテンプレート パラダイムを悪用しているように感じます。

  2. static const メンバーを使用して に格納nBase、派生クラスでそれを参照します。

    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
    };
    

    ここでの問題は、同じ識別子 ( nnvs. n) を使用できないように見えることです。nnまた、これが派生クラスのメンバーのテンプレート引数として使用できるかどうかもわかりません。

では、これを非冗長で効率的な方法で実装するにはどうすればよいでしょうか? たぶんstatic const int、どこかのメンバーとして何かを使用していますか?

4

2 に答える 2

5

標準的な方法は、テンプレートパラメータに大文字を使用し、次に小文字の静的const値を使用することです。

template<int N>
class Base {
protected:
  static const int n = N;
  ...
};

次に、どこでも小文字のstaticconst値を使用します。他の場所nでは使用しないでくださいN

また、これにより、派生クラスのメンバーのテンプレート引数としてnnを使用できるかどうかもわかりません。

これは定数式であるため、テンプレート引数として使用できます。

于 2013-01-21T09:34:13.893 に答える
0

これはあなたのために働きますか?

template<int n>
class Base {
protected:
    static const int MyN = n;
};

class Derived3 : public Base<3> {
    void f()
    {
        std::cout << MyN;
    }
};

class Derived7 : public Base<7> {
    void f()
    {
        std::cout << MyN;
    }
};

int main()
{

}
于 2013-01-21T09:35:17.187 に答える