Я уверен, что это не тот ответ, который вы ожидали, но ...
этот код
enum class TestEnum : uint32_t
{
};
template<typename TEnum>
void test(TEnum v)
{ // Line 12
if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int8_t>)
{
std::cout << "int8" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint8_t>)
{
std::cout << "uint8" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int16_t>)
{
std::cout << "int16" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint16_t>)
{
std::cout << "uint16" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int32_t>)
{
std::cout << "int32" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint32_t>)
{
std::cout << "uint32" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int64_t>)
{
std::cout << "int64" << std::endl;
}
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint64_t>)
{
std::cout << "uint64" << std::endl;
}
else
{
static_assert(false, "Unsupported enum type!");
}
}
int main(int argc, char *argv[])
{
TestEnum e{};
test<TestEnum>(e);
return EXIT_SUCCESS;
}
не выдает никаких предупреждений
однако
enum class TestEnum : uint32_t
{
};
template<typename TEnum>
void test(TEnum v)
{ // Line 12
if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int8_t>)
std::cout << "int8" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint8_t>)
std::cout << "uint8" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int16_t>)
std::cout << "int16" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint16_t>)
std::cout << "uint16" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int32_t>)
std::cout << "int32" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint32_t>)
std::cout << "uint32" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, int64_t>)
std::cout << "int64" << std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>, uint64_t>)
std::cout << "uint64" << std::endl;
else
static_assert(false, "Unsupported enum type!");
}
int main(int argc, char *argv[])
{
TestEnum e{};
test<TestEnum>(e);
return EXIT_SUCCESS;
}
выдает то же сообщение, что и при первом снимке экрана. Я знаю, что это по-французски, но поверьте мне, это говорит то же самое.
Только для дебатов я так и не понял, почему норма все еще позволяет
if(boolean) do;
в то время как
if(boolean) { do;}
делает работу без какой-либо двусмысленности. Конечно, грязное наследие того, что допускал Фортран 77. Откровенно говоря, прошло 40 лет, и мы не собираемся кричать, если нам нужно добавить еще двух персонажей ... Ну, я не ...