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

时间:2013-01-21 09:29:37

标签: c++ templates polymorphism

在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,并在Derived7n=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;
    

    问题在于DerivedTemplateX只对n=X有意义,所以这就像滥用模板范例一样。

  2. 使用静态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
    };
    

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

  

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

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

答案 1 :(得分: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()
{

}