是否有一些类型特征检查,如果一个整数类型可以保存其他整数类型的值而没有数据丢失?
例如VisitListener
可能包含int32_t
,uint16_t
,uint8_t
,int32_t
和int16_t
。
但int8_t
无法暂停int32_t
,uint32_t
或uint64_t
。
我做了天真的解决方案,我将其作为答案发布。我知道可以使用int64_t
,但我认为这种方式更具表现力。
答案 0 :(得分:11)
我们可以利用现有的语言规则。
对于列表初始化,缩小转换的格式不正确。我们正在尝试检测缩小的转化次数。因此,到void_t
!
template <class X, class Y, class = void>
struct can_hold : std::false_type { };
template <class X, class Y>
struct can_hold<X, Y,
void_t<decltype(X{std::declval<Y>()})>>
: std::true_type { };
答案 1 :(得分:0)
天真的解决方案:
#include <type_traits>
#include <cstdint>
template<typename A, typename B>
struct can_hold : std::false_type{};
template<>
struct can_hold<int8_t,int8_t> : std::true_type{};
template<>
struct can_hold<int16_t,int8_t> : std::true_type{};
template<>
struct can_hold<int16_t,int16_t> : std::true_type{};
template<>
struct can_hold<int16_t,uint8_t> : std::true_type{};
template<>
struct can_hold<int32_t,int8_t> : std::true_type{};
template<>
struct can_hold<int32_t,int16_t> : std::true_type{};
template<>
struct can_hold<int32_t,int32_t> : std::true_type{};
template<>
struct can_hold<int32_t,uint8_t> : std::true_type{};
template<>
struct can_hold<int32_t,uint16_t> : std::true_type{};
template<>
struct can_hold<int64_t,int8_t> : std::true_type{};
template<>
struct can_hold<int64_t,int16_t> : std::true_type{};
template<>
struct can_hold<int64_t,int32_t> : std::true_type{};
template<>
struct can_hold<int64_t,int64_t> : std::true_type{};
template<>
struct can_hold<int64_t,uint8_t> : std::true_type{};
template<>
struct can_hold<int64_t,uint16_t> : std::true_type{};
template<>
struct can_hold<int64_t,uint32_t> : std::true_type{};
template<>
struct can_hold<uint8_t,uint8_t> : std::true_type{};
template<>
struct can_hold<uint16_t,uint8_t> : std::true_type{};
template<>
struct can_hold<uint16_t,uint16_t> : std::true_type{};
template<>
struct can_hold<uint32_t,uint8_t> : std::true_type{};
template<>
struct can_hold<uint32_t,uint16_t> : std::true_type{};
template<>
struct can_hold<uint32_t,uint32_t> : std::true_type{};
template<>
struct can_hold<uint64_t,uint8_t> : std::true_type{};
template<>
struct can_hold<uint64_t,uint16_t> : std::true_type{};
template<>
struct can_hold<uint64_t,uint32_t> : std::true_type{};
template<>
struct can_hold<uint64_t,uint64_t> : std::true_type{};
template<>
struct can_hold<float,float> : std::true_type{};
template<>
struct can_hold<double,float> : std::true_type{};
template<>
struct can_hold<double,double> : std::true_type{};
int main(){
}