检查STL库的源代码,我遇到了指定模板变量的宏_Tp和_Up。他们在哪里定义,两者有什么区别?为什么要使用这样的宏?我无法找到有关此编程策略的任何信息。
编辑:我指的是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 };
我试图了解复制构造函数及其注释的含义,并决定这是否是一个简单的可复制类。
答案 0 :(得分:6)
所有以下划线后跟大写字母的名称都保留给实现。
这是因为如果他们使用T
而不是_Tp
,则T
可以是用户定义的宏,这会破坏标准库。
请参阅glibc Reserved Names:
除了本手册中记录的名称外,保留名称还包括以下划线('_')开头的所有外部标识符(全局函数和变量)以及所有使用以下划线或下划线开头的标识符其次是大写字母是保留名称。这样,库和头文件可以为内部目的定义函数,变量和宏,而不会有与用户程序中的名称冲突的风险。
答案 1 :(得分:4)
我假设您正在查看GNU标准库实现,libstdc ++使用那些名称作为模板参数,它们是不是宏。
此类名称保留用于实施(以下划线开头,后跟大写字母)保留。
e.g。 (来自<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;