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

考虑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有意义,所以这就像滥用模板范式一样.
>使用静态const成员在Base中存储n,并在派生类中引用它:

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对n).另外,我不确定这是否允许我使用nn作为派生类成员的模板参数.

那么:如何以非冗余,有效的方式实施?也许在某处使用某种静态const int作为成员?

解决方法:

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

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

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

Also, I’m not sure whether this will allow me to use nn as a template argument for members of the derived classes.

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

上一篇:c运算符重载的多态性


下一篇:C中的转换函数指针