在 C++1y 中是必需的公共类类型定义

Are public, in-class typedefs necessary in C++1y?

本文关键字:类型 定义 C++1y      更新时间:2023-10-16

我注意到std::容器往往有public类内类型别名(typedef/using)。例如,请参阅 http://en.cppreference.com/w/cpp/container/vector 中的成员类型。

它们有什么用?它们不就是C++没有autodecltype之类的东西的时代的遗物吗?

在实现自定义容器时,它应该具有这样的typedef吗?如果我未能提供它们,我会失去什么?

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

如果您查看文档,例如在 cpp首选项中,您将看到这样的段落:

std::vector 满足 Container、AllocatorAwareContainer、SequenceContainer、ContiguousContainer(对于 T 而不是 bool)(自 C++17 起)和 ReverseContainer 的要求。

如果你查找 Container 或 SequenceContainer 或其中列出的任何其他东西,你会发现一个需求列表,而 typedefs(或者更确切地说是 typedefs——它们不一定 typedefs,尽管它们通常是)就是其中之一。

因此,如果你正在构建一个标准意义上的容器,你需要提供 typedefs(当然也满足所有其他要求)。

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

std::vector<int>::iterator

可读性比

decltype(std::declval<std::vector<int>>().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
}

我正在为Windows做很多C++,并且由于Windows API提供了C结构,因此我使用了许多这样的技术来区分实际C++对象和WinApi结构。

typedef(s)允许将实现与接口分开。

考虑到早期的C++并没有像现在那样定义autodecltype标准中也没有。

但是,即使现在您有autodecltype有时最好显式指定对象的类型。否则,代码可能难以阅读或可能导致错误。

考虑一个带有类型说明符的简单示例auto

unsigned int x = 0;
long y = 0;
auto p = new auto( x + y );

你能说指针p的类型是什么吗?

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

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

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

这也允许编写通用代码。

在我的个人资料中,有一个对我文章的引用,其中我展示了一个与标准类std::bitset相关的问题,该类没有通用类型 size_type 。在这种情况下,如果您需要替换例如类std::vector<bool>std::bitset则需要更改使用size_type或某些显式类型(如 size_t)的所有位置的代码。