2011-09-23 57 views
6

在Bjarne Stroustrup C++ Book(第13章,第331页)中,它表示“模板参数可用于后续模板参数的定义”。它给出了以下代码:必须将模板参数设置为类型吗?

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

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

非常感谢

+3

你应该知道,这是有效的,只有当T是一个整数类型 – Riga

回答

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等,但不floatstd::stringconst char*等),如@Riga在他/她的评论中提及。

6

def_val是一个值参数。一个实例可以是这样的:

Cont<int, 1> foo; 

一个有趣的情况下,这是非常有用的,当你想有一个指针指向一个类成员为模板paremeter:

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

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

+2

虽然我认为正确的术语是“非类型模板参数”。 – pmr

3

下面是如何实例上面的例子:

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

int main() 
{ 
    Cont<int,42> c; 
} 
2

T def_valT类型(这是以前通过)的一个对象。例如,它可以用于初始化容器中的项目。使用时,它看起来是这样的:

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

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

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

+0

我不知道这是否有效。也许如果Object的构造函数是constexpr? –

+0

增加了一点免责声明。 – ssube

相关问题