我发现许多嵌套的std::conditional_t很难阅读,因此我选择了一种不同的模式(在具有auto返回类型的函数上调用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。
return return_void();
替换为return void();
- 如果没有其他实现细节,那就少了一个。 - StoryTeller - Unslander Monicareturn;
即可。 - Evgif constexpr
应该比任何基于特化或 SFINAE 的东西编译速度要快得多。 - n. m.