在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
与n
)。另外,我不确定这是否允许我使用nn
作为派生类成员的模板参数。
那么:如何以非冗余,有效的方式实施?也许在某个地方使用某种static const int
成员?
答案 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()
{
}