什么是_Tp和_Up

What are _Tp and _Up?

本文关键字:Up Tp 什么      更新时间:2023-10-16

在检查STL库的源代码时,我发现了指定模板变量的宏_Tp和_Up。它们是在哪里定义的,两者之间有什么区别?为什么要使用这样的宏?我找不到任何关于这个编程策略的信息。

EDIT:我指的是GCC STL库,尤其是复杂类,它是一个模板化的类,内容如下:

00115   template<typename _Tp>
00116     class complex
00117     {
00118     public:
00120       typedef _Tp value_type;
00121       
00124       complex(const _Tp& = _Tp(), const _Tp & = _Tp());
00125 
00126       // Lets the compiler synthesize the copy constructor   
00127       // complex (const complex<_Tp>&);
00129       template<typename _Up>
00130         complex(const complex<_Up>&);
00776   };

我试图理解复制构造函数及其注释的含义,并决定这是否是一个微不足道的可复制类。

所有以下划线和大写字母开头的名称都保留用于实现。

这是因为如果他们使用T而不是_Tp,那么T可以是用户定义的宏,这将破坏标准库。

参见glibc保留名称:

除了本手册中记录的名称外,保留名称还包括以下划线('_')开头的所有外部标识符(全局函数和变量),并且无论使用何种标识符,以两个下划线或下划线后跟大写字母开头的所有标识符都是保留名称。这样,库和头文件就可以为内部目的定义函数、变量和宏,而不会有与用户程序中的名称冲突的风险。

我假设您正在查看GNU标准库的实现,libstdc++使用那些名称作为模板参数,它们是而不是宏。

这些名称是为实现保留的(以下划线开头,后跟大写字母)是保留的。

例如(来自<functional>

  template<typename _Tp, typename _Up>
auto
_M_call(_Tp&& __object, _Up * const *) const noexcept
-> decltype((*std::forward<_Tp>(__object)).*std::declval<__pm_type&>())
{ return (*std::forward<_Tp>(__object)).*__pm; }

template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
  bool
  operator()(const _Tp& __x, const _Tp& __y) const
  { return __x < __y; }
};

编辑:

这同样适用于您在编辑中显示的complex模板:_Tp设计模板参数,即您可以将模板用作:

std::complex<double> c1;
std::complex<float> c2;