今天我在stl_pair.h中看到以下代码:
#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
template <class _T1, class _T2>
inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
return !(__x == __y);
}
template <class _T1, class _T2>
inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
return __y < __x;
}
#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
我认为模板功能与部分特化没有任何关联 功能模板 我错了吗?
答案 0 :(得分:0)
在C ++中调用函数模板通过名称查找的三位一体(标准中的第3.4节),模板参数扣除(第14.8.2节)和< strong>超载分辨率(第13.3节)。
除了阅读C++ Standard,中的这些部分,您可以在优秀的书C++ Templates: The Complete Guide中阅读这些部分,或者观看Stephan T. Lavavej的前三部Core C ++视频
正如您自己已经发现的那样,宏最初是在STL的SGI实现中,当时还没有C ++标准,并且编译器对函数模板的支持非常粗略。
// * __STL_FUNCTION_TMPL_PARTIAL_ORDER:如果编译器定义 支持//功能模板的部分排序。 (a.k.a部分 //功能模板的专业化。)
要了解功能模板的部分排序,请参考以下内容(如果您阅读本书并观看链接的视频,这将更加清晰。)
14.5.6.2功能模板的部分排序[temp.func.order]
1 如果函数模板过载,则使用函数模板 专业化可能含糊不清因为模板参数扣除 (14.8.2)可以将功能模板专业化与更多相关联 比一个函数模板声明。 重载的部分排序 函数模板声明在以下上下文中使用 选择功能模板所在的功能模板 专业化指的是:
- 在调用a的重载解析期间 功能模板专业化(13.3.3);
- 当地址为 功能模板专业化;
- 当一个贴装操作员 删除是一个功能模板,选择匹配特化 新的安置操作员(3.7.4.2,5.3.4);
- 当朋友的功能 声明(14.5.4),显式实例化(14.7.2)或 显式特化(14.7.3)是指函数模板 专业化。
2部分排序选择两个功能中的哪一个 通过转换每个模板,模板比其他模板更专业 模板轮流(见下一段)和执行模板参数 使用函数类型进行推导。 扣除过程决定 其中一个模板是否比另一个模板更专业。如果 所以,更专业的模板是由partial选择的模板 订购流程。