这是一个模板特化。典型情况下应该是部分特化:
#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"; }
};
这是一个专业化的过程。 template<>
表示该专业化本身不是模板-也就是说,它是显式专业化,而不是部分专业化。
template<typename T> struct A { template<typename U> void f(); }; template<> template<typename U> void A<int>::f() { }
。在这个例子中,成员的显式特化本身仍然是一个模板。(这有点吹毛求疵,但很重要知道)。 - Johannes Schaub - litbtemplate< typename T > struct Allowed
;struct Allowed<std::string>
并不能表明您正在专门针对模板进行操作,而只是将其实例化为类型std::string。(单词“struct”不必要做到这一点,但仍然被允许)。