gpt4 book ai didi

c++ - STL 代码 typedef typename value_type、size_type 等。这些是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 02:49:36 24 4
gpt4 key购买 nike

在某些 STL 类中,您可以找到这样的代码(取自 vector header ):

        // TEMPLATE CLASS _Vector_val
template<class _Val_types>
class _Vector_val
: public _Container_base
{ // base class for vector to hold data
public:
typedef _Vector_val<_Val_types> _Myt;
typedef typename _Val_types::value_type value_type;
typedef typename _Val_types::size_type size_type;
typedef typename _Val_types::difference_type difference_type;
typedef typename _Val_types::pointer pointer;
typedef typename _Val_types::const_pointer const_pointer;
typedef typename _Val_types::reference reference;
typedef typename _Val_types::const_reference const_reference;

typedef _Vector_iterator<_Myt> iterator;
typedef _Vector_const_iterator<_Myt> const_iterator;

_Vector_val()
{ // initialize values
_Myfirst = pointer();
_Mylast = pointer();
_Myend = pointer();
}

pointer _Myfirst; // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array
};

我不明白(也不知道如何有效地进行谷歌搜索)这些代码行是如何工作的以及它们在做什么:

typedef typename _Val_types::value_type value_type;

例如,为什么 value_type 显然在 _Val_types 的命名空间内?

另外,为什么这里有一个看起来像是函数调用的东西?:_Myfirst = pointer();

希望有人能解释这是如何工作的,或者指导我访问一些解释它的相关网站。

非常感谢!

最佳答案

_Val_types 不是命名空间名称,它是实例化 class _Vector_val 的任何类型。不允许将命名空间名称用作模板参数。

typedef typename _Val_types::value_type value_type;

在上面的行中,您正在创建一个名为 value_type 的类型,它是嵌套类型的别名,也称为 value_type,在 _Val_types 中定义 类型。 typename 关键字的原因是当您引用依赖类型时它是必需的(value_type 取决于 _Val_types 的类型) , 引用this comprehensive answer了解更多详情。

_Myfirst = pointer();

上面一行是默认构造一个指针并将该值赋给_Myfirst。如果 pointer 是普通类型,假设 _Val_typesint 并且 _Val_type::pointer 定义为 int *,那么上面的表达式会值初始化一个int *,也就是零初始化它,零可以转换为nullptr。长话短说,它将 _Myfirst 数据成员设置为 nullptr

关于c++ - STL 代码 typedef typename value_type、size_type 等。这些是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21107146/

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