在Bjarne Stroustrup C++ Book(第13章,第331页)中,它表示“模板参数可用于后续模板参数的定义”。它给出了以下代码:必须将模板参数设置为类型吗?
template<class T, T def_val> class Cont{ /* ... */ }
任何人都可以提供如何使用此模板的示例。例如,如何初始化Cont的一个对象?它在我看来“def_val”不是一个类型参数,不应该放在<>中。我错了吗?
非常感谢
在Bjarne Stroustrup C++ Book(第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
为整型(int
,unsigned
,long
,char
等,但不float
,std::string
,const char*
等),如@Riga在他/她的评论中提及。
def_val
是一个值参数。一个实例可以是这样的:
Cont<int, 1> foo;
一个有趣的情况下,这是非常有用的,当你想有一个指针指向一个类成员为模板paremeter:
template<class C, int C::*P>
void foo(C * instance);
这使得foo
是使用指向任何类的int
类型成员的指针实例化。
虽然我认为正确的术语是“非类型模板参数”。 – pmr
下面是如何实例上面的例子:
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;
(伪代码; Object
显然必须是一个类型是合法的,以这种方式使用)
那然后使用第二个模板参数。它包含在模板中,因为它具有模板类型; def_val
必须是T
类型,并且必须在创建对象时传递。
我不知道这是否有效。也许如果Object的构造函数是constexpr? –
增加了一点免责声明。 – ssube
你应该知道,这是有效的,只有当T是一个整数类型 – Riga