模板参数必须是类型

Must template parameters be types?

本文关键字:类型 参数      更新时间:2023-10-16

在Bjarne Stroustrup C++书(第13章,第331页(中,它说"一个模板参数可以用于后续模板参数的定义"。它给出了以下代码:

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

有人能提供一个如何使用这个模板的例子吗。例如,如何初始化Cont的对象?在我看来,"def_val"不是一个类型参数,不应该放在<>中。我错了吗?

非常感谢

您可以这样做:

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等,而不是floatstd::stringconst char*等(时,这才有效,正如@Riga在其评论中提到的那样。

def_val是一个值参数。实例化可能如下所示:

Cont<int, 1> foo;

当你想要一个指向类成员的指针作为模板参数时,这是有用的一个有趣的例子:

template<class C, int C::*P>
void foo(C * instance);

这使得foo能够用指向任何类的int类型的成员的指针来实例化。

下面是如何实例化上面的示例:

template<class T, T def_val> class Cont{ /* ... */ };
int main()
{
    Cont<int,42> c;
}

T def_val是类型为T的对象(之前已传递(。例如,它可以用于初始化容器中的项。使用时,它看起来像:

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

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

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