c++ - std::is_union 实现如何工作?
问题描述
我目前正在更详细地浏览 C++ 标准库,我想知道它的实现是如何std::is_union
工作的。在 libcxx (LLVM) 中,除了直接使用可能内置的__is_union
,它被定义为
template <class _Tp> struct __libcpp_union : public false_type {};
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_union
: public __libcpp_union<typename remove_cv<_Tp>::type> {};
同样,STLPort,虽然很老,但实现起来更加简约:
template <class T>
struct is_union
{ };
这似乎总是解决std::false_type
,甚至更糟的是,一个空结构,但它没有;这是如何实现的?在另一个问题中,答案表明is_union
没有编译器钩子就无法实现,但这是否意味着 libcxx、STLPort 以及可能所有主要实现都不能移植到任何不能自动使其工作的编译器?
解决方案
并非所有标准库都可以用 C++ 实现。
您跳过了各种内在函数的测试。
is_union
本质上,没有内在函数就无法实现。
该std
库不是C++ 附带的库,它是该语言的一部分。 #include <vector>
允许某些代码工作;不需要vector
存在标头,只需在指令之后更改 C++ 程序的状态。
在实践中(通过设计),它是在内部函数的帮助下作为相对传统的库在 C++ 中编写和实现的,并使用保留标记编写以避免预处理器冲突(例如,变量名__
和_Ty
变量名)。
推荐阅读
- c# - 如何在不注册身份的情况下从外部提供商获取用户登录信息
- android - Android Linkify:URL 未转换为网络链接
- reactjs - 在 Material UI XGRID 上显示单选按钮而不是复选框
- mongodb - 如何使用 mongoose 检查 mongodb 文档数组中的现有条目
- video-streaming - 我已经从 mp4 转换了 m3u8 文件。从我的服务器访问视频时未播放视频以及如何添加视频质量
- css - CSS:向滚动条添加左边距
- python - Django:无法从模板保存图像
- reactjs - React开发模式下如何检测对象热重载
- java - 如何将视频添加到媒体商店数据库?
- iis - IIS Server Windows server 2012 r2 文件删除问题