Пусть метод bool возвращает другое целое число - PullRequest
0 голосов
/ 16 февраля 2020
class I {
public:
    virtual bool F() = 0;
};

class A :public I {
public:
    virtual bool F() {
        int i = 2;
        return i;
    }
};

void test() {   
    A a;
    int i=a.F();
    std::cout << i;
}

класс I - это протокол, который нелегко изменить.

Хотите передать больше информации, чем true / false, поэтому хотите использовать свойство boint uint8_t в C ++.

Но компилятор (VS2019 / VS2017) добавляет инструкции для преобразования целого числа в 0 или 1 в конце метода bool перед возвратом. Нет разговора на стороне вызывающей стороны (только инструкция movzx eax, al), что хорошо.

Есть ли такой метод, как флаг компиляции или некоторый встроенный код сборки в конце метода bool, чтобы позволить методу bool вернуть целое число, отличное от 0/1?

1 Ответ

0 голосов
/ 16 февраля 2020

Простой отказ от ответственности в том, что этот ответ ни в коем случае не подходит для производственного использования. Он использует поведение, которое обычно не определено.

Вы можете использовать reinterpret_cast, чтобы преобразовать возвращаемое значение в логическое значение без фактического запуска конструктора bool (следовательно, не изменив фактическое значение на 0/1).

class A :public I {
public:
    virtual bool F() {
        int i = 2;
        return *reinterpret_cast<bool *>(&i);;
    }
};
...