在 C++1y 中是必需的公共类类型定义
Are public, in-class typedefs necessary in C++1y?
我注意到std::
容器往往有public
类内类型别名(typedef
/using
)。例如,请参阅 http://en.cppreference.com/w/cpp/container/vector 中的成员类型。
它们有什么用?它们不就是C++没有auto
和decltype
之类的东西的时代的遗物吗?
在实现自定义容器时,它应该具有这样的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++并没有像现在那样定义auto
,decltype
标准中也没有。
但是,即使现在您有auto
和decltype
有时最好显式指定对象的类型。否则,代码可能难以阅读或可能导致错误。
考虑一个带有类型说明符的简单示例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
)的所有位置的代码。
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?