问题描述
我目前正在更详细地了解 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
can't be implemented without compiler hooks,但这是否意味着 libcxx、STLPort 和可能所有主要实现都不能移植到任何不能自动使其工作的编译器?
解决方法
并非所有标准库都可以用 C++ 实现。
您跳过了各种内在函数的测试。
基本上没有内在函数就无法实现 is_union
。
std
库不是 C++ 附带的库,它是语言的一部分。 #include <vector>
允许某些代码工作;不需要 vector
头文件,只是 C++ 程序的状态必须在指令后改变。
在实践中(按设计)它是在 C++ 中作为相对传统的库在内部函数的帮助下编写和实现的,并使用保留标记编写以避免预处理器冲突(__
和 _Ty
变量名称,例如)。