什么是_Tp和_Up
What are _Tp and _Up?
在检查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;
相关文章:
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何让C++'tally up'结果并制定计划?
- QGraphicsItems not showing up QGraphicsScene
- OpenGL通常"Up"方向?
- 使用外部依赖项运行 VC++ 单元测试时"Failed to set up execution context"
- 带有"up-"和"center-vec3"参数的glm::rotate()的有效替代方案?
- Cin messing up SetConsoleTitle
- 线程池的计时测试:单线程 vs 回调 tp vs 未来 tp
- 当您通过Qt小部件打开文件时,是否可以'pop-up'文件?
- "Cleaning up"嵌套的 if 语句
- ISO C++禁止在我的代码中使用可变长度数组 'up' [-Wvla]
- Speeding up makefile for SDL2
- setting up sfml
- QTableView does not show up
- CDT 在以下期间发生内部错误: "Setting up indexer"
- Setting up GLEW with QGLWidget
- 从 BSTR tp std::string 转换大字符串
- c++ setting up for sqlite3
- Glib::Regex picking up TextTag-s
- Splitting up classes c++