1

我试图从 VS2012 附带的 C++ 标准库中了解 xutility。与 VS 附带的所有标准库版本一样,没有一个是漂亮的。但特别是有两个声明让我完全难过。即全局声明的结构体_Get_unchecked_type 和_Is_checked_helper。

_Get_unchecked_type 的实现看起来像这样。

// file <xutility>

        // TEMPLATE STRUCT _Get_unchecked_type
template<class _Ty>
    struct _Get_unchecked_type
        _GET_TYPE_OR_DEFAULT(_Unchecked_type,
            _Ty);
// file <xtr1common>

#define _GET_TYPE_OR_DEFAULT(TYPE, DEFAULT) \
    { \
    template<class _Uty> \
        static auto _Fn(int) \
            -> typename _Uty::TYPE; \
 \
    template<class _Uty> \
        static auto _Fn(_Wrap_int) \
            -> DEFAULT; \
 \
    typedef decltype(_Fn<_Ty>(0)) type; \
    }

所以。_Get_unchecked_type 是一个结构体,其整个主体由 xtr1common 中定义的宏 _GET_TYPE_OR_DEFAULT 定义。

_GET_TYPE_OR_DEFAULT 的第一个参数是 _Unchecked_type,它似乎在任何地方都没有有意义地定义。将鼠标悬停在 _Unchecked_type 上,弹出窗口会告诉您它是 'typedef <error-type> _Unchecked_type',这没有任何意义,因为 '<error-type>' 不是有效类型。右键单击 _Unchecked_type 并选择“转到定义”将带您到 _Array_const_iterator::_Unchecked_type 的定义,这也是不正确的,因为 struct _Get_unchecked_type 是在全局范围内定义的。

所以第一个问题是,_Unchecked_type 是什么,它在哪里定义,你希望如何解决它?

继续 _GET_TYPE_OR_DEFAULT 的定义。该宏声明了两个名为_Fn 的静态成员函数模板重载。对于我的生活,我找不到这些的定义。这些是做什么的,它们是在哪里定义的,你应该如何解决这个问题?

_Is_checked_helper 的定义同样是迟钝的。

有人可以帮我理解这些做什么以及它们是如何工作的。

4

1 回答 1

1

xutility是实现的一部分,根本不是为了可读。它可能使用未定义的内部编译器行为。_Unchecked_type是为编译器保留的名称,并且可以像int我们所知道的那样预定义。

无论如何,这type通过重载选择定义成员_Fn。有 2 个方法被命名Fn,一个取int并返回Ty::TYPE,另一个取_Wrap_int并返回第二个宏参数DEFAULT。第一次转换更好,但假设Ty::TYPE存在。

因此,如果存在,则为,_Get_unchecked_type<A>::type否则。A::_Unchecked_typeA

于 2013-07-09T21:24:07.753 回答