Я знаю, что этот вопрос касается 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
как возвращаемый тип.
Поскольку для operator<<
нет перегрузки, которая принимает указатель на член напрямую, a
и b
неявно преобразуются в bool
, для которых существует перегрузка. Семантика этого стандартного преобразования выглядит следующим образом:
Prvalue арифметики, нумерация, указатель или указатель на тип члена могут быть преобразованы в prvalue типа
blockquote>bool
. Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется вfalse
; любое другое значение преобразуется вtrue
.Таким образом,
a
иb
оба становятсяtrue
, и поэтому значение напечатано1
.
Попробуйте следующее:
int main()
{
cout << std::boolalpha << a << endl << b; //1
}
Вы увидите, что теперь получаете «истинное». Это просто неявное преобразование в стрельбу bool
.