【发布时间】:2009-07-22 00:08:03
【问题描述】:
是否可以在专门的模板类中访问非类型模板参数的值?
如果我有专门化的模板类:
template <int major, int minor> struct A {
void f() { cout << major << endl; }
}
template <> struct A<4,0> {
void f() { cout << ??? << endl; }
}
我知道在上述情况下,硬编码值 4 和 0 而不是使用变量很简单,但是我有一个更大的类,我正在专门研究它,我希望能够访问这些值。
是否可以在 A 中访问 major 和 minor 值(4 和 0)?还是我必须在模板实例化时将它们分配为常量:
template <> struct A<4,0> {
static const int major = 4;
static const int minor = 0;
...
}
【问题讨论】:
-
如果您基于价值观进行专业化,那么这意味着这些特定价值观有一些特别之处。如果您在整个模板中将它们用作通用值,并且只在少数地方将它们视为特殊的,那么您可能可以将特殊行为抽象为一个较小的专用类模板,而使大模板完全通用且非专用。这有点难说,所以你能把你的问题扩大到更“真实”吗?
-
我认为这个问题足够真实。我有现有的基类,它根据协议版本实现特定行为。以前它有一个返回协议版本的成员 - 由于该成员不再可用,因此有一个日志记录方法在输出中包含协议版本。我可以对值进行硬编码,但我想知道是否有更好的方法。接受的答案提供了很好的方法 - 我实际上在其他地方以类似的方式使用特征 - 用于获取参数类型但意图是相同的。
标签: c++ templates template-specialization