Метод C ++ с типом перечислимого класса - PullRequest
0 голосов
/ 19 февраля 2019

Возникла проблема при попытке распечатать метод класса, который имеет тип перечисления enum.

У меня есть метод, который возвращает перечисление, которое приведено к bool:

bool Window::IsVSync() const
{
    return static_cast<bool>(m_WindowData.VSync);
}

m_WindowData.VSync является типом VSync.

И это перечислимый класс:

enum class VSync : bool
{
    Disable = false,
    Enable = true
}

Я знаю, что с перечислимым классом я неЯ не получаю неявное преобразование, и именно поэтому я приведу к bool.И так все работает просто отлично.Но учитывая тот факт, что мой enum-класс расширен от bool, могу ли я сделать что-то вроде этого:

VSync Window::IsVSync() const
{
    return m_WindowData.VSync;
}

Сначала я думал, что смогу, так как мы расширяем enumкласс от bool, но я ошибся, и он выдает мне эту ошибку при попытке вывести на консоль:

бинарный '<<': не найден оператор, который принимаетправый операнд типа 'VSync' (или нет приемлемого преобразования) </p>

Я печатаю метод на консоли с помощью:

std::cout << myWindow.IsVSync() << "\n";

Что, конечно, должно возвращать либо 1, либо 0;

Когда я приведу его к bool в выводе, вот так:

std::cout << static_cast<bool>(myWindow.IsVSync()) << "\n";

работает просто отлично, но я нехочу, чтобы пользователь должен был привести его к bool, чтобы он работал.Мне нужно решение, которое находится в самом методе, поэтому вызов остается таким:

std::cout << myWindow.IsVSync() << "\n";

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете определить перегрузку оператора потока вне класса для типа enum следующим образом:

static std::ostream& operator<<(std::ostream& os, const VSync& val)
{
    switch (val) {
        case VSync::Disable:
            os << "VSync disabled";
            break;
        case VSync::Enable:
            os << "VSync enabled";
            break;
    }
    return os;
}

Таким образом, вам не нужно ничего приводить, и вы можете напечатать что-то более подробное, чем 1 или 0 (или необходимость использования std::boolalpha).

Я надеюсь, что это может помочь.

0 голосов
/ 19 февраля 2019

Он не расширяется от bool, использует то же количество места, что и bool.
С помощью enum двоеточие не обозначает наследование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...