考虑 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 成员存储
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
也许在某处使用某种成员身份?