P0138R2 proposal begins with1
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!).
To convert Index
to its underlying type it is useful to define
int operator*(Index index) {
return static_cast<int>(index);
}
Another way to create Index
type is to use old class
:
class Index final {
public:
explicit Index(int index = 0) : index_(index) { }
int operator*() const {
return index_;
}
private:
int index_;
};
Both seem to be largely equivalent and can be used in the same way:
void bar(Index index) {
std::cout << *index;
}
bar(Index{1});
int i = 1;
bar(Index{i});
Pro of enum class
: the comparison operators are defined automatically, con of enum class
: index value for the default constructed enum class
can't be specified, it is always zero.
Are there other practical differences between these alternatives? Which one should be preferred?
1 I changed
uint32_t
to int
to avoid #include <cstdint>
.
Aucun commentaire:
Enregistrer un commentaire