Значение C ++ указателя члена класса [дубликат]

Я знаю, что этот вопрос касается std::enable_if, однако мне нравится предлагать альтернативное решение для решения одной и той же проблемы без enable_if. Для этого требуется C ++ 17

template <class T>
class check
{
public:
   inline static T readVal()
   {
        if constexpr (std::is_same_v<T, int>)
             return BuffCheck.getInt();
        else if constexpr (std::is_same_v<T, double>)
             return BuffCheck.getDouble();
   }   
};

Этот код выглядит скорее так, как если бы вы его записывали во время выполнения. Все ветви должны быть синтаксически правильными, однако семантика не обязательно должна быть. В этом случае, если T является int, getDouble не вызывает ошибок компиляции (или предупреждений), поскольку он не получает проверку / использование компилятором.

Если тип возвращаемой функции будет к сложному упоминанию, вы всегда можете использовать auto как возвращаемый тип.

5
задан roalz 22 March 2017 в 09:36
поделиться

2 ответа

Поскольку для operator<< нет перегрузки, которая принимает указатель на член напрямую, a и b неявно преобразуются в bool, для которых существует перегрузка. Семантика этого стандартного преобразования выглядит следующим образом:

Prvalue арифметики, нумерация, указатель или указатель на тип члена могут быть преобразованы в prvalue типа bool. Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется в false; любое другое значение преобразуется в true.

Таким образом, a и b оба становятся true, и поэтому значение напечатано 1.

7
ответ дан Brian 16 August 2018 в 11:46
поделиться

Попробуйте следующее:

int main()
{
    cout << std::boolalpha << a << endl << b; //1
}

Демо

Вы увидите, что теперь получаете «истинное». Это просто неявное преобразование в стрельбу bool.

4
ответ дан Angew 16 August 2018 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: