gpt4 book ai didi

c++ - 类与枚举类作为索引类型

转载 作者:行者123 更新时间:2023-12-03 06:49:41 27 4
gpt4 key购买 nike

P0138R2 proposal以 1 开头

There is an incredibly useful technique for introducing a new integer type that is almost an exact copy, yet distinct type in modern C++11 programs: an enum class with an explicitly specified underlying type. Example:

enum class Index : int { };    // Note: no enumerator.

One can use Index as a new distinct integer type, it has no implicit conversion to anything (good!).



转换 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 的亲: 比较运算符是自动定义的,con of enum class : 默认构造的索引值 enum class无法指定,它始终为零。

这些替代方案之间是否存在其他实际差异?

1 我改了 uint32_tint避免 #include <cstdint> .

最佳答案

我使用的强类型的替代方案是 NamedTypes 的变体作者:乔纳森·博卡拉他在他的博客上的多篇文章中很好地解释了所有细节,请参阅 https://www.fluentcpp.com/2016/12/08/strong-types-for-strong-interfaces/
写起来稍微冗长一点:using Index = NamedType<int, struct IndexTag, Comparable, ImplicitlyConvertibleTo<int>>;当你构建这个时,你需要写一些类似 Index{0} 的东西。 ,但是,当您将其用作索引时,它应该会自动转换为基础类型。
它有几个优点,包括能够处理任何类型。最大的缺点是它是您必须导入的外部库,而不是内置功能。

关于c++ - 类与枚举类作为索引类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52045697/

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