Ответ 1
std::is_integral
проверяет, является ли тип одним из следующих типов: bool
, char
, char16_t
, char32_t
, wchar_t
, short
, int
, long
, long long
(source). Если вы хотите проверить, совпадает ли тип с другим типом, можно использовать std::is_same
. Оба могут быть объединены, чтобы получить желаемый результат:
template <typename T> void output(T x)
{
if constexpr (std::is_integral<decltype(x)>::value && !std::is_same<decltype(x), bool>::value) {
std::cout << static_cast<int>(x) << " is integral but not a boolean" << std::endl;
} else {
std::cout << x << " is not integral" << std::endl;
}
}
или, поскольку мы уже знаем тип decltype(x)
, который является T
:
template <typename T> void output(T x)
{
if constexpr (std::is_integral<T>::value && !std::is_same<T, bool>::value) {
std::cout << static_cast<int>(x) << " is integral but not a boolean" << std::endl;
} else {
std::cout << x << " is not integral" << std::endl;
}
}
Другой способ - использовать специализированную специализацию. Это гарантирует, что другая перегрузка используется для обработки логического значения.
template <typename T> void output(T x)
{
if constexpr (std::is_integral<T>::value) {
std::cout << static_cast<int>(x) << " is integral but not a boolean" << std::endl;
} else {
std::cout << x << " is not integral" << std::endl;
}
}
template <> void output(bool x)
{
std::cout << x << " is a boolean" << std::endl;
}