2010-06-10 101 views
3

我在几个地方见过这个,并且确认我并不疯狂,我looked for other examples。显然这也可以用于其他口味,例如operator+ <>C++中的运算符<< <>是什么?

但是,我在任何地方都没有看到任何提及它的内容,所以我想我会问。

这不是在声明函数名后,谷歌operator<< <>( :-)

+2

有时候这很有帮助:http://www.google.com/codesearch – Cam 2010-06-10 01:04:32

+4

pssstt,incrediman!看看我链接到什么... – 2010-06-10 01:12:11

+0

是的,这就像搜索[trigraph]一样简单(http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C):-) – 2010-06-10 01:17:04

回答

13

<>(包括运营商,像operator<<)最容易的事情表明,它是一个函数模板特殊化。例如,对于一个普通的函数模板:

template <typename T> 
void f(T x) { } 

template<> 
void f<>(int x) { } // specialization for T = int 

(注意,尖括号可能在他们列出的模板参数,取决于函数模板是如何专业)

<>也可以后使用调用函数名时的功能,显式调用函数模板时有那些通常在重载更好的匹配非模板函数:

template <typename T> 
void g(T x) { } // (1) 

void g(int x) { } // (2) 

g(42); // calls (2) 
g<>(42); // calls (1) 

所以,operator<< <>不是运营商。

+0

James,没有函数模板部分特化,所以对于函数模板,这些尖括号总是空的。最后一句话可能会让那些在说“功能模板”时会说“模板函数”并可能从更全面的解释中受益的人感到困惑。无论如何,你的答案会得到一个+1,如果可以的话,我会给它一个+10,因为它教会了我一些新的东西:我不知道可以通过这种方式显式地选择函数模板。 – sbi 2010-06-10 06:46:58

+0

@sbi:“template”关键字后面的尖括号始终为空。功能模板名称后面的尖括号可能不是。例如,在我给出的第一个例子中,可以明确指出'int'(即,'template <> void f (int x){}'将产生相同的结果)。如果无法从专业化的返回类型和参数列表推导出模板参数,那么必须明确说明这些参数。 – 2010-06-10 13:50:02

+0

对于尖括号,你当然是对的。对不起,这个brainfart。 – sbi 2010-06-10 13:59:38