【发布时间】:2018-08-30 07:42:49
【问题描述】:
我发现许多嵌套的 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 慢(假设我需要实例化的类型比我只使用内置类型的示例中的要广泛得多)。
附:这是一个玩具示例,IRCode 我将处理一些更复杂的类型。
【问题讨论】:
-
不是您的 Q 的答案,但您可以将
return return_void();替换为return void();- 如果没有别的实现细节,请少做一个 -
return;也可以。 -
if constexpr,如果有的话,应该比任何基于专业化或基于 SFINAE 的编译速度快
标签: c++ templates typetraits if-constexpr