为什么宏__STL_FUNCTION_TMPL_PARTIAL_ORDER将std_pair.h中的模板函数括起来

时间:2014-01-08 15:12:40

标签: c++ templates overload-resolution argument-deduction

今天我在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 */

我认为模板功能与部分特化没有任何关联 功能模板 我错了吗?

1 个答案:

答案 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选择的模板   订购流程