Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是C+中必需的公共类内typedef+;1岁?_C++_C++11_C++14 - Fatal编程技术网

C++ 是C+中必需的公共类内typedef+;1岁?

C++ 是C+中必需的公共类内typedef+;1岁?,c++,c++11,c++14,C++,C++11,C++14,我注意到std::容器往往具有public,类内类型别名(typedef/使用)。 例如,参见第页的成员类型 它们有什么用处?难道C++只是没有“ Auto/和 DeCype < /C>?< /P>之类的东西的遗迹吗? 在实现自定义容器时,它是否应该具有这样的typedefs?如果我不能提供它们,我会损失什么?如果你想要一个标准的库兼容容器,你必须提供typedef 如果您查看文档,例如,在,您将看到以下段落: vector满足容器、分配器容器、SequenceContainer、Conting

我注意到
std::
容器往往具有
public
,类内类型别名(
typedef
/
使用
)。 例如,参见第页的成员类型

它们有什么用处?难道C++只是没有“<代码> Auto/<代码>和<代码> DeCype < /C>?< /P>之类的东西的遗迹吗?
在实现自定义容器时,它是否应该具有这样的
typedef
s?如果我不能提供它们,我会损失什么?

如果你想要一个标准的库兼容容器,你必须提供typedef

如果您查看文档,例如,在,您将看到以下段落:

vector满足容器、分配器容器、SequenceContainer、ContinguousContainer(对于bool以外的T)(从C++17开始)和ReversibleContainer的要求

如果您查找Container或SequenceContainer或此处列出的任何其他内容,您将找到一个需求列表,typedefs(或者更确切地说,它们不必是typedefs,尽管它们经常是)就在其中

因此,如果您要以术语的标准意义构建容器,则需要提供typedef(当然还需要满足所有其他要求)

理论上,C++11可以放松需求,但事实并非如此。也许是因为

std::vector<int>::iterator
std::vector::迭代器
它的可读性比

decltype(std::declval<std::vector<int>>().begin())
decltype(std::declval().begin())

或者可能是因为其他原因。

它们在处理元编程时非常有用

让我们通过引用捕捉一个容器,如果它是一个POD容器,则捕捉一次,如果它不是:

template <class T>
typename std::enable_if_t<std::is_pod<typename T::value_type>::value>
doSomething(T& container){
   //do something
}

template <class T>
typename std::enable_if_t<!std::is_pod<typename T::value_type>::value>
doSomething(T& container){
   //do something
}
模板
typename std::启用\u如果\u t
剂量计(T和容器){
//做点什么
}
模板
typename std::如果\u t::value>
剂量计(T和容器){
//做点什么
}

我做了很多C++的Windows,由于Windows API提供了C结构,所以我使用了很多这样的技术来在真实的C++对象和WINAPI结构之间进行区分。p> typedef允许将实现与接口分开

< >进入早期,C++没有定义“代码>自动<代码>,现在定义为<>代码> DeCyty/<代码>。

但是,即使是现在,当您拥有
auto
decltype
时,有时最好明确指定对象的类型。否则,代码可能很难读取,或者会导致错误

考虑使用类型说明符
auto

unsigned int x = 0;
long y = 0;

auto p = new auto( x + y );
你能说出指针p的类型吗

表达式
*p
是无符号类型还是有符号类型

答案取决于使用的平台。p的类型可以是
long*
unsigned long*

标准容器也存在类似的问题。因此,该标准引入了诸如
size\u type
之类的通用类型名,以确保该类型是无符号类型,但其宽度可能因平台而异

这也允许编写通用代码


在我的个人资料中,有一篇文章引用了我的文章,其中我展示了一个与标准类
std::bitset
没有泛型类型
size\u type
相关的问题。在这种情况下,如果需要将示例类
std::vector
替换为
std::bitset
,则需要在使用
size\u type
或某种显式类型(如
size\u t
)的地方更改代码

请提供一个具体的例子,说明“像
auto
decltype
这样的东西”是如何完成这项工作的,以前必须使用公共的
typedef
类型。我认为这些类型的存在使得算法头中的算法使用的各种类型特征不需要为每个容器类型显式实例化。有时显式化也有助于可读性和可维护性。@Cheersandhth.-Alf我认为依赖于向量的C++98模板必须执行如下操作:std::vector::iterator it=x.begin()而在C++1y中,您不必知道返回类型的名称:
autoit=x.begin()
@PSkocik:对于迭代器类型,新代码不需要
typedef
s是正确的。我认为问题更多的是“它们是否有用”而不是“是否有正式要求拥有它们”。但是,是的,最后的问题也是关于正式要求的。@Cheersandhth.-Alf是的,但这也有帮助。谢谢,n.m.对可读性观察投了赞成票,但请注意,这只是定义正确的支持抽象的问题。在C++03中,支持抽象是简单的
typedef
s或类型定义。在C++11中,对于新代码,它们通常不需要是:例如,类型可以通过特征推断出来。现在有一个问题,我们可以用
typedefs
替换为
using
别名声明吗?它符合容器概念吗?@coincoin IMHO,是的。这个概念提到类型,而不是如何得到这些类型。