在派生类中使用基类的模板参数

Rom*_*man 3 c++ polymorphism templates

考虑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
};
Run Code Online (Sandbox Code Playgroud)

里面的Derived3成员函数,我想明确地使用n=3了,里面Derived7,n=7而不硬编码的数字,即,仍参考就像一个模板参数n.我想到了以下选项:

  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;
    
    Run Code Online (Sandbox Code Playgroud)

    这个问题是DerivedTemplateX除了之外什么都没有意义n=X,所以这就像滥用模板范式一样.

  2. 使用静态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
    };
    
    Run Code Online (Sandbox Code Playgroud)

    这里的问题是我似乎无法使用相同的标识符(nnvs. n).另外,我不确定这是否允许我将其nn用作派生类成员的模板参数.

那么:如何以非冗余,有效的方式实施?也许static const int在某个地方使用某种成员?

Pub*_*bby 5

标准做法是对模板参数使用大写字母,然后使用小写的静态const值:

template<int N>
class Base {
protected:
  static const int n = N;
  ...
};
Run Code Online (Sandbox Code Playgroud)

然后在任何地方使用小写的静态const值n- 不要N在其他任何地方使用.

另外,我不确定这是否允许我使用nn作为派生类成员的模板参数.

它是一个常量表达式,因此可以用作模板参数.