我很好奇为什么允许使用匿名模板typename / class声明,例如:
template <typename, class, typename> struct TemplateTest1 { int a; float b ; } ;
TemplateTest1 <int, int, int> tt1 ;
有人能解释这些匿名类型的实用价值吗?它们会影响模板化结构的表达吗?
答案 0 :(得分:10)
通过匿名,我认为您的意思是未命名的模板参数。
这是允许的,因为有时你可能不需要模板参数,因此使它成为匿名让程序员明白参数虽然没有必要,但在课堂上的任何地方都没有使用过。
它类似于允许带有未命名参数的函数的方式:
void f(int) //allowed
{
}
答案 1 :(得分:3)
程序员可以选择键入定义特定的模板实例化,该实例化应仅用于该类型。一种类型可能有<int,int,bool>
,另一种类型可能有<float, bool string>
,程序员不希望它们可以转换。底层结构相同,但它们不可转换。
就像:
struct ABC
{ int a,b;};
struct XYZ
{ int a,b;};
两种类型都相同,但ABC
不能转换为XYZ
,反之亦然。许多Windows句柄都是通过DECLARE_HANDLE
声明的,并且不可转换。