VS2012 std库xutility不可读的实现

时间:2013-07-09 20:58:36

标签: visual-studio-2012 c++-standard-library

我正在尝试从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&lt; error-type&gt; _Unchecked_type'自'&lt; error-type&gt;'以来没有任何意义不是有效的类型。右键单击_Unchecked_type并选择'Go To Definition'将转到_Array_const_iterator :: _ Unchecked_type的定义,这也是正确的,因为struct _Get_unchecked_type是在全局范围内定义的。

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

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

_Is_checked_helper的定义同样是钝的。

有人可以帮助我了解这些行为以及它们如何运作。

1 个答案:

答案 0 :(得分:1)

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

无论如何,这通过type上的重载选择来定义成员_Fn。有两个名为Fn的方法,一个采用int并返回Ty::TYPE,另一个采用_Wrap_int并返回第二个宏参数DEFAULT。第一次转换效果更好,但假设Ty::TYPE存在。

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