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

问题描述 投票:0回答:3

是否可以检查(在 C++ 中)类型是否可转换(隐式或显式)?

std
中有什么东西吗?或者是否可以像 C# 一样编写一个函数(C# 相同的问题)?

我想对 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
c++ casting c++03
3个回答
10
投票

在 C++11 中,您可以使用

std::is_convertible
参考)。这检查是否可以进行隐式转换。它不考虑转换是否有损。


示例:

#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

8
投票

这样:

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
{};

0
投票

我建议忽略C++03要求

template<typename F, typename T>
concept static_castable = requires(F & v) { static_cast<T>(v); };
© www.soinside.com 2019 - 2024. All rights reserved.