是否有类型特征,显示一种类型是否可能包含其他类型的值

时间:2017-11-01 10:00:21

标签: c++ c++11 c++14

是否有一些类型特征检查,如果一个整数类型可以保存其他整数类型的值而没有数据丢失?

例如VisitListener可能包含int32_tuint16_tuint8_tint32_tint16_t

int8_t无法暂停int32_tuint32_tuint64_t

更新

我做了天真的解决方案,我将其作为答案发布。我知道可以使用int64_t,但我认为这种方式更具表现力。

2 个答案:

答案 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(){
}