8

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

如果你真的知道类型 A 和 B,这很好用,但我只有 type_infos。所以我正在寻找的是这样的功能:

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

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

4

2 回答 2

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_infos 都具有派生自std::type_info(abi::__class_type_info只是一个示例) 的动态类型。

使用这个 ABI,可以构建一个工具来导航任何类型的继承层次结构(在运行时),给定它的std::type_info. 在这样做的过程中,您可以确定两个std::type_infos 是否代表两种可能是dynamic_cast或什static_cast至彼此的类型。

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

于 2012-05-08T23:50:53.650 回答
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 *"

然后你必须创建一个multimapor 键为typeid(你想知道它是否可转换为)和值作为convertible type ids(可转换类型) Where like if 。在这种情况下,您可以访问地图以搜索key 您的情况const type_info& from中的 a 是否具有value映射到const type_info& to。如果是,那么您可以将 bool 返回为truefalse。但在这种情况下,您需要确保正确地看到所有类和代码中的继承。并在此基础上决定是否合法转换并在此基础上添加到地图上。但这将是一个乏味的过程,我看不出它有什么用处。

一般来说,c++ 让您知道dynamic cast一个类型是否可以正确地转换为其他类型。Whilestatic_cast甚至会将不兼容的类型相互转换,并且使用不当会导致运行时错误

于 2012-05-08T16:58:43.693 回答