在现代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
的Pro:比较运算符是自动定义的,enum class
的con:无法指定默认构造的enum class
的索引值,它始终为零。>
这些选择之间是否还有其他实际区别?
uint32_t
更改为int
,以避免#include <cstdint>
。
答案 0 :(得分:1)
我使用的强类型的替代方法是Jonathan Boccara对NamedTypes的一种变体。他很好地解释了他博客上多个帖子中的所有详细信息,请参见https://www.fluentcpp.com/2016/12/08/strong-types-for-strong-interfaces/
在书面上稍微冗长一些:using Index = NamedType<int, struct IndexTag, Comparable, ImplicitlyConvertibleTo<int>>;
构造此函数时,需要编写类似Index{0}
的内容,但是,一旦将其用作索引,它应该会自动转换为基础类型。
它具有多个优点,包括能够处理任何类型的内容。最大的缺点是它是您必须导入的外部库,而不是内置功能。</ p>