Класс против перечисляемого класса как тип индекса - PullRequest
0 голосов
/ 27 августа 2018

Предложение 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>.
...