在Bjarne Stroustrup C ++ Book(第13章,第331页)中,它说“模板参数可用于后续模板参数的定义”。它提供了以下代码:
template<class T, T def_val> class Cont{ /* ... */ }
任何人都可以提供如何使用此模板的示例。例如,如何初始化Cont的对象?在我看来,“def_val”不是类型参数,不应该放在&lt;&gt;中。我错了吗?
非常感谢
答案 0 :(得分:7)
您可以这样做:
Cont<int, 6> cnt;
// ^ as long as this is of type T (in this case int)
// def_val will be of type int and have a value of 6
模板参数不一定是类型。
这仅适用于T
是整数类型(int
,unsigned
,long
,char
等但不是float
,{ {1}},std::string
等),正如@Riga在他/她的评论中提到的那样。
答案 1 :(得分:6)
def_val
是一个值参数。实例化可能如下所示:
Cont<int, 1> foo;
这个有用的有趣案例是当你想要一个指向类成员的指针作为模板参数时:
template<class C, int C::*P>
void foo(C * instance);
这使得foo
能够使用指向任何类的int
类型成员的指针进行实例化。
答案 2 :(得分:3)
以下是如何实例化上述内容的示例:
template<class T, T def_val> class Cont{ /* ... */ };
int main()
{
Cont<int,42> c;
}
答案 3 :(得分:2)
T def_val
是T
类型的对象(之前已通过)。例如,它可用于初始化容器中的项目。要使用,它看起来像:
Object init(0);
Cont<Object, init> cont;
(伪代码; Object
显然必须是以这种方式合法使用的类型)
然后使用第二个模板参数。它包含在模板中,因为它具有模板类型; def_val
必须是T
类型,并且必须在创建对象时传递。