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

GiC*_*iCo 10 c++ casting c++03

是否可以检查(在C++中)类型是否可转换(隐式或显式)?是否存在某些内容std或是否可以编写类似C#(C#同一问题)的函数?

我想对类型执行此检查而不是类型的实例.

我不确定C++中的类型系统.有没有类似TypeC#或Java 的类?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
Run Code Online (Sandbox Code Playgroud)

小智 6

这边走:

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
{};
Run Code Online (Sandbox Code Playgroud)


Dan*_*vil 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
Run Code Online (Sandbox Code Playgroud)