Visual studio 2012 VS2012 std库xutility不可读实现 我试图从VS2012的C++标准库中了解XUpLoad。与VS附带的标准库的所有版本一样,所有版本都不好看。但有两个声明让我完全困惑不解。即全局声明的结构_Get _unchecked _type和_Is _checked _helper

Visual studio 2012 VS2012 std库xutility不可读实现 我试图从VS2012的C++标准库中了解XUpLoad。与VS附带的标准库的所有版本一样,所有版本都不好看。但有两个声明让我完全困惑不解。即全局声明的结构_Get _unchecked _type和_Is _checked _helper,visual-studio-2012,c++-standard-library,Visual Studio 2012,C++ Standard Library,_Get_unchecked_类型的实现如下所示 //文件 //模板结构\u获取\u未选中\u类型 模板 结构\u获取\u未选中\u类型 _获取\u类型\u或\u默认值(\u未选中\u类型, _(Ty),; //文件 #定义\u获取\u类型\u或\u默认值(类型,默认值)\ { \ 模板\ 静态自动(int)\ ->typename _Uty::TYPE\ \ 模板\ 静态自动(自动换行)\ ->违约\ \ typedef decltype(_Fn(0))类型\ } 所以_Get_unche

_Get_unchecked_类型的实现如下所示

//文件
//模板结构\u获取\u未选中\u类型
模板
结构\u获取\u未选中\u类型
_获取\u类型\u或\u默认值(\u未选中\u类型,
_(Ty),;
//文件
#定义\u获取\u类型\u或\u默认值(类型,默认值)\
{ \
模板\
静态自动(int)\
->typename _Uty::TYPE\
\
模板\
静态自动(自动换行)\
->违约\
\
typedef decltype(_Fn(0))类型\
}
所以_Get_unchecked_type是一个结构,其整个主体由xtr1common中定义的宏\u Get_type_或\u DEFAULT定义

_GET_TYPE_或_DEFAULT的第一个参数是_Unchecked_TYPE,它似乎没有在任何地方进行有意义的定义。将鼠标移到“未选中的类型”上,弹出窗口会告诉您它是“类型定义未选中的类型”,这没有任何意义,因为“”不是有效类型。右键单击_Unchecked_type并选择“转到定义”将进入_Array_const_iterator::_Unchecked_type的定义,该类型也不能正确,因为struct _Get_Unchecked_type是在全局范围内定义的

所以第一个问题是,什么是_Unchecked_类型,它是在哪里定义的,你希望如何解决这个问题

继续讨论“获取类型”或“默认值”的定义。此宏声明两个名为_Fn的静态成员函数模板重载。我一生都找不到这些的定义。它们是做什么的,它们的定义在哪里,你又该如何计算呢

_的定义是_checked_helper同样是迟钝的


有人能帮我了解一下它们的功能和工作原理吗。

xutility
是实现的一部分,根本不具有可读性。它可能使用未定义的内部编译器行为
\u Unchecked\u type
是为编译器保留的名称,可以像
int
一样预定义

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


因此,
\u Get\u unchecked\u type::type
A::\u unchecked\u type
,如果存在,则为
A

是实现的一部分,根本不希望可读。它可能使用未定义的内部编译器行为
\u Unchecked\u type
是为编译器保留的名称,可以像
int
一样预定义

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


因此,
\u Get\u unchecked\u type::type
A::\u unchecked\u type
,如果存在,则为
A

非常感谢。在你的帮助下,我想我现在明白了。但是,我确实感到恼火的是,库编写者似乎没有义务让代码可读,特别是对于像标准库这样设计为可扩展的库。我不知道XTULL在如何包含许多核心迭代器声明时如何被看作是一个实现细节,如果您希望创建一个新的标准库兼容容器,或者甚至只是一个新的迭代器专门化,那么您需要理解的是,尽管如此,我认为这里的问题大部分在于C++本身。在这种情况下,对于模板代码,它并没有提供将接口与实现分离的有效方法。我曾希望C++11能在这方面取得一些进展,但如果情况变得更糟,这是奇怪的,因为在非模板代码的区域中,C++与接口之间的分离程度与其他语言一样好。@中微子:C++当然是唯一有模板的主流语言。java和.net定义的泛型是为了避免C++与模板的问题,结果是泛型可以导致装箱。另外,他们不能做模板元编程。至于扩展,您根本不需要
xutility
。事实上,您现在可以在for循环中使用与STL兼容的容器,而不包括任何头。非常感谢。在你的帮助下,我想我现在明白了。但是,我确实感到恼火的是,库编写者似乎没有义务让代码可读,特别是对于像标准库这样设计为可扩展的库。我不知道XTULL在如何包含许多核心迭代器声明时如何被看作是一个实现细节,如果您希望创建一个新的标准库兼容容器,或者甚至只是一个新的迭代器专门化,那么您需要理解的是,尽管如此,我认为这里的问题大部分在于C++本身。在这种情况下,对于模板代码,它并没有提供将接口与实现分离的有效方法。我曾希望C++11能在这方面取得一些进展,但如果说有什么进展的话,情况似乎会变得更糟,这是很奇怪的,因为在美国