这两个专业基本上是做同样的事情吗?部分课程专业化只是完全专业化的一种不同方式吗?
//generic:
template<class T>
struct A{
...
}
template<class T>
struct A<int>{
...
}
template<>
struct A<int>{
...
}
也就是说,在我看来,任何部分专业化可以被重写为完全专业化。
这两个专业基本上是做同样的事情吗?部分课程专业化只是完全专业化的一种不同方式吗?
//generic:
template<class T>
struct A{
...
}
template<class T>
struct A<int>{
...
}
template<>
struct A<int>{
...
}
也就是说,在我看来,任何部分专业化可以被重写为完全专业化。
不,它不是。那么,在Turing tar pit中,每一个足够强大的编程技术都相当于其他所有的编程技术。
template<typename A, typename B>
struct foo:std::false_type {};
template<typename T>
struct foo<T,T>:std::true_type {};
在这里,我的部分专业化将两个参数映射到一个。更高级的东西,如:
template<typename T>
struct foo<T,std::vector<T>>:std::integral_constant<int, 7> {};
也是可能的。
你甚至可以带一个参数:template
做到这一点:
template<typename T>
struct is_func_signature : std::false_type {};
template<typename R, typename... Args>
struct is_func_signature< R(Args...) >: std::true_type {};
我们模式匹配一个参数上许多类型的参数,并提取它们。
部分专业化是对参数进行模式匹配的游戏,该参数将对第一个接口有效。
我假设每个偏分模板本身就是它自己的类,与初始泛型类的成员没有内在关系,对吧? – johnbakers
@Fellowshee:是的,每个专业都是一个完全独立的课程。它们之间的唯一关系是相同的名称可以选择任何专业化(取决于参数)。 –
我期望编译器在第二个定义上发出一条错误消息(因为不使用“T”)。 – jogojapan