Предложение 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});
Pro из enum class
: операторы сравнения определяются автоматически, con из enum class
: значение индекса для построенного по умолчанию значения enum class
не может быть указано, оно всегда равно нулю.
Есть ли другие практические различия между этими альтернативами?
1 Я изменил
uint32_t
на
int
, чтобы избежать
#include <cstdint>
.