是否可以检查(在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
答案 0 :(得分:5)
在C ++ 11中,您可以使用std::is_convertible
(reference)。这将检查是否可以进行隐式转换。它没有考虑转换是否有损。
示例:
#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
{};