gpt4 book ai didi

c++ - std::is_empty 如何在 VS2015(或任何编译器)中实现?

转载 作者:可可西里 更新时间:2023-11-01 18:29:13 33 4
gpt4 key购买 nike

我当前的问题是受到试图理解 std::unique_ptr<T, D> 的启发。利用模板机制来实例化一个大小为 T* 的模板类什么时候D (删除器类型)是 lambda 函数类型,但在 D 时更大是函数指针类型(因为需要在unique_ptr实例中分配空间来存储函数指针)。

查看VS2015源码,发现std::unique_ptr源自 std::_Unique_ptr_base ,它又声明了一个 _Compressed_pair<class _Ty1, class _Ty2, bool = is_empty<_Ty1>::value && !is_final<_Ty1>::value> 类型的数据成员.类型_Ty1在后一种情况下是删除器的类型,D , 那是第二个 unique_ptr上一段中提到的模板参数;也就是说,这个问题背后的动机是我在对比 _Ty1作为 lambda 类型,与 _Ty1 相比是一个函数指针类型。 (实际上,正在使用 bool 的默认值。)

我认识到 is_empty<_Ty1>::valuetrue什么时候_Ty1是 lambda 类型的实例(当 lambda 没有捕获变量因此大小为 0 时);但它是false什么时候_Ty1是函数指针类型。

这让我开始研究如何 std::is_empty已定义。

呃!

下面是std::is_empty的完整实现我可以在 VS2015 C++ 库源代码中找到它。

在文件中type_traits这是:

// TEMPLATE CLASS is_empty
template<class _Ty>
struct is_empty _IS_EMPTY(_Ty)
{ // determine whether _Ty is an empty class
};

... 和宏 _IS_EMPTY在同一个文件中定义:

#define _IS_EMPTY(_Ty)  \
: _Cat_base<__is_empty(_Ty)>

...此时我的运气用完了,因为我找不到 __is_empty 的定义任何地方。我已经 GREP 遍历了整个 VS2015 安装目录(我认为,其中包括所有 C++ 库源代码,尽管我可能弄错了)。

我喜欢在需要时了解 C++ 内部结构。但是......我坚持这一点,大量谷歌搜索没有揭示答案(尽管我已经看到对内在函数的引用),而且我的挖掘没有......发现任何源代码。

有人可以解释一下这种情况吗? std::is_empty<T>如何实际上是在 VS2015 中实现的,还是在任何其他编译器中实现的?

最佳答案

看起来好像 MSVC++ 提供了一个内在的 __isempty(T)而不是处理库级别的实现。由于参数类型 T传递给 std::is_empty<T>可以是final ,我认为不会有安全的库实现,可能需要编译器帮助。

判断一个类型是否为T的唯一方法在库中是空的我能想到的是这个(专门处理非 class 类型, std::is_empty<T> 不是 true ):

template <bool, typename T>
struct is_empty_aux: T { unsigned long long dummy; };
template <typename T>
struct is_empty_aux<false, T> { unsigned long long dummy[2]; };

template <typename T>
struct is_empty:
std::integral_constant<bool,
sizeof(is_empty_aux<std::is_class<T>::value, T>)
== sizeof(unsigned long long)> {
};

但是,如果Tfinal is_empty_aux 中的继承是非法的。而案例一final可以使用 std::is_final<T> 检测类我看不到确定其对象是否为空的方法。因此,可能需要使用编译器内在函数。无论如何,编译器内在函数对于某些其他类型特征来说肯定是必需的。编译器内在函数是编译器以某种方式神奇地提供的声明/定义:它们通常既不显式声明也不定义。编译器具有关于类型的必要知识,通过内在函数公开这些知识是一种合理的方法。

关于c++ - std::is_empty<T> 如何在 VS2015(或任何编译器)中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531309/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com