类与枚举类作为索引类型
Class vs enum class as an index type
P0138R2提案以1开头
有一种非常有用的技术可以引入一种新的整数类型,该类型几乎是现代 C++11 程序中的精确副本,但又是不同的类型:一个
enum class
显式指定的基础类型。例:enum class Index : int { }; // Note: no enumerator.
可以将
Index
用作新的不同整数类型,它没有隐式转换为任何内容(好!
要将Index
转换为其基础类型,定义
int operator*(Index index) {
return static_cast<int>(index);
}
创建Index
类型的另一种方法是使用旧class
:
class Index final {
public:
explicit Index(int index = 0) : index_(index) { }
int operator*() const {
return index_;
}
private:
int index_;
};
两者似乎在很大程度上是等效的,可以以相同的方式使用:
void bar(Index index) {
std::cout << *index;
}
bar(Index{1});
int i = 1;
bar(Index{i});
优点enum class
:比较运算符是自动定义的,缺点enum class
:无法指定默认构造enum class
的索引值,它始终为零。
这些替代方案之间还有其他实际差异吗?
1我
uint32_t
更改为int
以避免#include <cstdint>
。
我使用的强类型的替代方案是Jonathan Boccara的NamedType的变体。他在博客上的多篇文章中很好地解释了所有细节,请参阅 https://www.fluentcpp.com/2016/12/08/strong-types-for-strong-interfaces/
写作稍微啰嗦一些:using Index = NamedType<int, struct IndexTag, Comparable, ImplicitlyConvertibleTo<int>>;
当你构造它时,你需要写一些类似Index{0}
的东西,但是,当你把它用作索引时,它应该自动转换为底层类型。
它有几个优点,包括能够处理任何类型的产品。最大的缺点是它是您必须导入的外部库,而不是内置功能。
相关文章:
- 在 std::variant 中按类型获取索引
- 类与枚举类作为索引类型
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 对于检查 >=0 终止条件时的循环索引类型
- 在索引和值类型上参数化的惯用向量类型
- 用于迭代不同类型的向量的索引类型
- 如何处理使用不同类型索引的不同库(例如 stl 和 eigen3)的混合(size_t、int、..)
- C++:从类型索引中获取超类类型索引
- 在运行时C++11 个索引模板参数包,以便访问第 N 种类型
- 通过索引将字节插入mutli字节类型
- 使用类型作为索引
- 如何确定未知类型数组的索引是否为空
- 使用查找表选择具有运行时索引的可变参数类型
- 将RGB颜色图像转换为OpenCV C 中的索引颜色图像类型
- 用户定义容器的索引类型
- 对于循环索引类型推导的最佳实践
- 为什么在c++中使用boost multi_array索引类型来索引boost数组?
- 在编译时根据可能的最大值确定索引类型
- 在vector元素上迭代时,索引类型应该是什么?
- 具有泛型索引类型的数组