gpt4 book ai didi

c++ - 许多嵌套 std::conditional_t 的替代品?

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:00 27 4
gpt4 key购买 nike

我发现许多嵌套的 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 我会处理一些更复杂的类型。

最佳答案

就我个人而言,我觉得这里最清晰的方法是“数据驱动”。将标准放在表中(写成类模板的特化形式)并让编译器进行模式匹配以确定类型更短、更不容易出错并且更易于阅读或扩展。

template<bool is_signed, std::size_t has_sizeof>
struct find_int_type_impl { using type = void; }; // Default case

template<> struct find_int_type_impl<true, 4> { using type = std::int32_t; };
template<> struct find_int_type_impl<true, 8> { using type = std::int64_t; };
template<> struct find_int_type_impl<false, 4> { using type = std::uint32_t; };
template<> struct find_int_type_impl<false, 8> { using type = std::uint64_t; };

template<bool is_signed, std::size_t has_sizeof>
using find_int_type = typename find_int_type_impl<is_signed, has_sizeof>::type;

关于c++ - 许多嵌套 std::conditional_t 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52091684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com