【问题标题】:why should the macro __STL_FUNCTION_TMPL_PARTIAL_ORDER enclose the template function in std_pair.h为什么宏 __STL_FUNCTION_TMPL_PARTIAL_ORDER 要将模板函数包含在 std_pair.h 中
【发布时间】:2014-01-08 15:12:40
【问题描述】:

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

我不认为模板函数与偏特化有任何关联 的功能模板。 我错了吗?

【问题讨论】:

  • 部分排序与部分特化无关(无论如何不能用函数模板完成)。偏序是关于如何对重载函数进行排序,其中多个函数适合一组参数。
  • 感谢您回答我的问题!你对偏序的解释是对的。但是用谷歌,我发现偏序用于模板函数重载。
  • 对,我应该说“对重载函数模板进行排序”。
  • 看了你的回答并搜索了一些资料后,我发现我应该学习一些关于名称查找、函数重载的东西,尤其是模板函数,但我不知道任何具体的材料,你能有什么建议吗?

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


【解决方案1】:

编译器如何处理函数调用

在 C++ 中调用函数模板会经历 Name Lookup(标准中的第 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: 如果编译器定义 支持 // 函数模板的部分排序。 (又名部分 // 函数模板的特化。)

要了解函数模板的偏序是用来做什么的,这里有一个引用(如果您阅读本书并观看链接的视频会更清楚)。

14.5.6.2 函数模板的部分排序[temp.func.order]

1 如果函数模板被重载,使用函数模板 专业化可能是模棱两可的,因为模板参数推导 (14.8.2) 可以将函数模板特化与更多 不止一个函数模板声明。 重载的部分排序 函数模板声明在以下上下文中使用 选择函数模板到的函数模板 专业化指

——在重载决议期间调用 功能模板专业化(13.3.3);

——当一个地址 采用功能模板特化;

——当放置操作符时 选择作为函数模板特化的删除来匹配 新的放置操作符(3.7.4.2、5.3.4);

——当朋友函数 声明 (14.5.4)、显式实例化 (14.7.2) 或 显式特化(14.7.3)指的是函数模板 专业化。

2 偏序选择两个函数中的哪一个 模板通过转换每个模板比其他模板更专业 依次模板(参见下一段)并执行模板参数 使用函数类型进行推导。 扣减过程决定 一个模板是否比另一个更专业。如果 因此,更专业的模板是部分选择的模板 订购流程

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2019-06-17
    • 2017-05-19
    相关资源
    最近更新 更多