type_info的std :: is_convertible

时间:2012-05-08 16:18:26

标签: c++ types casting c++11 typecast-operator

在C ++ 11中,可以确定类型A的变量是否可以using std::is_convertible<A, B>隐式转换为类型B.

如果您确实知道类型A和B,这很有效,但我只有type_infos。所以我正在寻找的是这样的函数:

bool myIsConvertible(const type_info& from, const type_info& to);

是否有可能在C ++中实现类似的东西?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:6)

便携式C ++无法做你想做的事。

可能可以实现部分答案如果您将自己限制在给定平台上。例如,那些遵守Itanium ABI的平台将具有此功能的实现:

extern "C" 
void* __dynamic_cast(const void *sub,
                     const abi::__class_type_info *src,
                     const abi::__class_type_info *dst,
                     std::ptrdiff_t src2dst_offset);

在此ABI中,abi::__class_type_info是从std::type_info派生的类型,程序中的所有 std::type_info都具有源自{{1}的动态类型(std::type_info只是一个例子)。

使用此ABI可以构建一个工具,该工具将导航任何类型的继承层次结构(在运行时),给定其abi::__class_type_info。这样做可以确定两个std::type_info代表两种类型,即std::type_info甚至dynamic_cast

请注意,此类解决方案不会考虑使用转换构造函数或转换运算符在类型之间进行转换。即使这个限制是可以接受的,我也不推荐这条路线。这不是一个简单的项目,而且非常容易出错。但这可能是你的C ++实现如何实现static_cast,所以这显然不是不可能的。

答案 1 :(得分:1)

我想这可以在你知道你的变量的typeid的情况下完成,你总是可以在c ++中使用typeid运算符知道。

  Derived* pd = new Derived;
  Base* pb = pd;
  cout << typeid( pb ).name() << endl;   //prints "class Base *"
  cout << typeid( *pb ).name() << endl;   //prints "class Derived"
  cout << typeid( pd ).name() << endl;   //prints "class Derived *"

然后你必须创建一个multimap或密钥为typeid(你想知道它是否可转换为),值为convertible type ids(可转换类型) 。在这种情况下,您可以访问地图以搜索案例key中的const type_info& from是否value映射到const type_info& to。如果是,那么您可以返回bool truefalse。但在这种情况下,您需要确保正确地看到代码中的所有类和继承。并在此基础上决定是否合法转换并在此基础上添加地图。但这将是一个繁琐的过程,我没有看到任何使用它。

如果类型可以转换为其他类型或不正确,通过c ++可以通过dynamic cast告诉您。虽然static_cast甚至会将不可比的类型相互转换,但不正确的使用会导致运行时错误