与C+混淆+;模板 我正在查看一些C++代码,不理解在这种情况下模板声明的目的: template<> void operator>>(const ClassA& s, const ClassB d) {...} 模板无效运算符>>(常量ClassA&s,常量ClassB d){…}

与C+混淆+;模板 我正在查看一些C++代码,不理解在这种情况下模板声明的目的: template<> void operator>>(const ClassA& s, const ClassB d) {...} 模板无效运算符>>(常量ClassA&s,常量ClassB d){…},c++,templates,programming-languages,semantics,C++,Templates,Programming Languages,Semantics,模板的语义是什么 它是:(完全或部分)解析特定类型的模板。(您的特定示例似乎是完全专门化,因为其中没有其他未解析的模板参数。如果模板有多个参数,而您只专门化其中一些参数,则称为部分模板专门化) 这允许为给定模板提供特定于类型的优化,或者执行许多巧妙的技巧,例如检测变量的静态类型等。这是当您想要为特定模板类型提供特殊处理程序时,可以使用此语法。考虑: // A normal template definition. template <typename AType> whoami ()

模板的语义是什么

它是:(完全或部分)解析特定类型的模板。(您的特定示例似乎是完全专门化,因为其中没有其他未解析的模板参数。如果模板有多个参数,而您只专门化其中一些参数,则称为部分模板专门化)


这允许为给定模板提供特定于类型的优化,或者执行许多巧妙的技巧,例如检测变量的静态类型等。

这是当您想要为特定模板类型提供特殊处理程序时,可以使用此语法。考虑:

// A normal template definition.
template <typename AType>
whoami () {   std::cout << "I am an unknown type.";  }

// Now we specialize.
template <>
whoami<int> () {   std::cout << "I am an integer!";  }
//一个普通的模板定义。
模板

whoami(){std::cout这确实是模板专门化,正如前面提到的其他模板一样。必须有一些以前声明的函数模板,例如:

template<typename T, typename U>
void operator>>(const T& s, const U d) {...}
正如预期的那样,调用了
int*
的模板专门化。但只需更改函数定义的顺序:

template <typename T>
void Function(T param);

template <>
void Function(int* param);

template <typename T>
void Function(T* param);

main()
{
  int i = 5;
  Function(&i);
}
现在声明的顺序无关紧要,我们将始终调用
int*
的重载


更新:现在我知道该归功于谁了。我在Herb Sutter的一篇文章中读到了这一点。这个例子是由Peter Dimov和Dave Abrahams提供的。

ter我认为OP给出的例子是无效的。如果我没记错的话,你不能专门化一个函数,你必须重载它。专门化只适用于类。@Victor,模板函数与类模板相比确实存在一些限制;不知道如何(以及是否存在)这改变了C++ 03和后来的。但是,C++中常见的FAQ例子似乎是函数模板的专业化,所以我假定它应该工作:-E.T.HMM有趣,我只是在一些编译器上尝试过,它确实接受了代码。ng of.@Victor T:就是这样,部分函数模板专门化是无效的,但完全专门化是可以接受的。然而,专门化函数模板很少是一个好主意(我已经尝试在我的回答中对此进行了解释)@Victor:C++03中的函数不能使用部分专门化,但完全专门化是可以的。谢谢你的回答,所以这是另一个使语言复杂化的技巧。就像重载一样,我认为这不是一个好主意。请看:@mathk:我不同意你链接的文章中的大多数观点。你不同意设计J艾娃。你不喜欢什么?@mathk:他似乎也不同意自己的观点,因为Java允许他批评的所有东西(比如构造函数和函数重载)。这让他正确地知道了为什么这不是一个好主意。
template <typename T>
void Function(T param);

template <>
void Function(int* param);

template <typename T>
void Function(T* param);

main()
{
  int i = 5;
  Function(&i);
}
void Function(int* param);