检查(原始)类型是否可以在C ++中转换

时间:2014-05-20 14:13:25

标签: c++ casting c++03

是否可以检查(在C ++中)类型是否可转换(隐式或显式)? std中是否有某些内容或是否可以编写C#(C# same Question)之类的函数?

我想对 types 执行此检查,而不是对该类型的实例执行此操作。

我不确定C ++中的类型系统。有没有类似C#或Java中的Type类? typeid(int)是我找到的最近的。我可以将类型存储到变量中吗?我们将非常感谢阅读提示。

例如:

bool isCastable(false);
bool withoutLoss(true);
isCastable = isCastableFromTo(typeid(int), typeid(__int64), withoutLoss); //true
isCastable = isCastableFromTo(typeid(int), typeid(short), withoutLoss); //false
isCastable = isCastableFromTo(typeid(int), typeid(double), withoutLoss); //true
isCastable = isCastableFromTo(typeid(double), typeid(int), withoutLoss); //false
isCastable = isCastableFromTo(typeid(string), typeid(int), withoutLoss); //false

withoutLoss = false;
isCastable = isCastableFromTo(typeid(int), typeid(__int64), withoutLoss); //true
isCastable = isCastableFromTo(typeid(int), typeid(short), withoutLoss); //true
isCastable = isCastableFromTo(typeid(int), typeid(double), withoutLoss); //true
isCastable = isCastableFromTo(typeid(double), typeid(int), withoutLoss); //true
isCastable = isCastableFromTo(typeid(string), typeid(int), withoutLoss); //false

2 个答案:

答案 0 :(得分:5)

在C ++ 11中,您可以使用std::is_convertiblereference)。这将检查是否可以进行隐式转换。它没有考虑转换是否有损。


示例:

#include <type_traits>
bool f_to_i = std::is_convertible<float,int>::value; // true
bool i64_to_i = std::is_convertible<int64_t,int>::value; // true
bool str_to_i = std::is_convertible<std::string,int>::value; // false

答案 1 :(得分:3)

这样:

template <class F, class T, class = T>
struct is_static_castable : std::false_type
{};

template <class F, class T>
struct is_static_castable<F, T, decltype(static_cast<T>(std::declval<F>()))> : std::true_type
{};