Я нахожу много вложенных std :: conditional_t трудными для чтения, поэтому я выбираю другой шаблон (вызова decltype для функции с типом автоматического возврата):
template<bool is_signed, std::size_t has_sizeof>
auto find_int_type(){
static_assert(sizeof(int)==4);
if constexpr(is_signed){
if constexpr(has_sizeof==4){
return int{};
} else if constexpr (has_sizeof==8){
return std::int64_t{};
} else {
return;
}
} else {
if constexpr(has_sizeof==4){
return (unsigned int){};
}
else if constexpr (has_sizeof==8){
return std::uint64_t{};
} else {
return;
}
}
}
static_assert(std::is_same_v<int, decltype(find_int_type<true, 4>())>);
static_assert(std::is_same_v<unsigned int, decltype(find_int_type<false, 4>())>);
static_assert(std::is_same_v<void, decltype(find_int_type<false, 3>())>);
static_assert(std::is_same_v<void, decltype(find_int_type<false, 5>())>);
static_assert(std::is_same_v<std::int64_t, decltype(find_int_type<true, 8>())>);
static_assert(std::is_same_v<std::uint64_t, decltype(find_int_type<false, 8>())>);
static_assert(std::is_same_v<void, decltype(find_int_type<false, 9>())>);
Мои вопросы:
Есть ли лучший способ?
Этот способ компилируется медленнее, чем std :: conditional_t (если предположить, что типы, которые мне нужно создать, гораздо шире, чем в этом примере, где я просто использую встроенные типы).
P.S. это игрушечный пример, IRCode Я бы имел дело с некоторыми более сложными типами.