模板参数必须是类型吗?

时间:2011-09-23 19:53:07

标签: c++ templates

在Bjarne Stroustrup C ++ Book(第13章,第331页)中,它说“模板参数可用于后续模板参数的定义”。它提供了以下代码:

template<class T, T def_val> class Cont{ /* ... */ }

任何人都可以提供如何使用此模板的示例。例如,如何初始化Cont的对象?在我看来,“def_val”不是类型参数,不应该放在&lt;&gt;中。我错了吗?

非常感谢

4 个答案:

答案 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是整数类型(intunsignedlongchar等但不是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_valT类型的对象(之前已通过)。例如,它可用于初始化容器中的项目。要使用,它看起来像:

Object init(0);
Cont<Object, init> cont;

(伪代码; Object显然必须是以这种方式合法使用的类型)

然后使用第二个模板参数。它包含在模板中,因为它具有模板类型; def_val必须是T类型,并且必须在创建对象时传递。