在C++中,template<>是什么意思?

54

这不是我熟悉的语法,但我在另一个问题中看到了它的例子:

template<> struct Allowed<std::string> { };

template<>表示没有模板类型/参数的模板特化。

3个回答

50

这是一个模板特化。典型情况下应该是部分特化:

#include <iostream>

template<class T1, class T2>
struct foo
{
  void doStuff() { std::cout << "generic foo "; }
};

template<class T1>
struct foo<T1, int>
{
 void doStuff() { std::cout << "specific foo with T2=int"; }
};

正如您所看到的,特化从模板参数中删除一个元素,并明确指定类型而不是删除的元素。这意味着如果只有一个模板类型,则<>将变为空:

template<class T1>
struct bar
{
  void doStuff() { std::cout << "generic bar"; }
};

template<>
struct bar<int>
{
 void doStuff() { std::cout << "specific bar with T1=int"; }
};

13
如果模板不能泛化,为什么还要使用template<>呢?为什么不只是将它作为int的结构体呢? - P.S.
如何声明并调用一个类型为 T1=int 的特定 bar? - skytree
8
@P.S. 因为您可能希望为所有非特化版本存在一个结构的版本。 - Elliott
以下是一些示例:https://github.com/pytorch/pytorch/blob/8d08b103be936d78d5d4ed90c0547aeccb8ce166/aten/src/ATen/native/cudnn/Conv_v7.cpp#L259 - Eduardo Reis

30

这是一个专业化的过程。 template<> 表示该专业化本身不是模板-也就是说,它是显式专业化,而不是部分专业化。


3
"template<>的意思是该特化本身不是模板。"这并不完全正确,因为它仅适用于该特定示例。例如:template<typename T> struct A { template<typename U> void f(); }; template<> template<typename U> void A<int>::f() { }。在这个例子中,成员的显式特化本身仍然是一个模板。(这有点吹毛求疵,但很重要知道)。 - Johannes Schaub - litb
4
我不理解这个答案。你能否修改一下以显示如何区分部分和特殊? - wallyk

12
您可能会说这只是所需的语法。
正常的语法应该是template< typename T > struct Allowed
因为我们知道在这种情况下T是std::string,所以尖括号中没有什么需要放置的内容,但单独写struct Allowed<std::string>并不能表明您正在专门针对模板进行操作,而只是将其实例化为类型std::string。(单词“struct”不必要做到这一点,但仍然被允许)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接