在 c++ 中,不同的类型转换是隐式完成的。例如,int
可以将类型的对象分配给const int
(如下面代码中 main 函数的第一行所做的那样)。
现在我想在运行时检查可转换性,因为我有一个可以添加类型的结构,然后我想检查给定类型,如果存储在结构中的类型之一可转换为给定类型。
到目前为止,这是我想出的:
#include <iostream>
#include <vector>
struct bar { virtual void dummy() {} };
template<typename T> struct foo : public bar { virtual void dummy() {} };
int main() {
int i1 = 1;
const int i2 = i1;
std::vector<bar*> bars;
bar* t1 = new foo<int>; bars.push_back(t1);
bar* t2 = new foo<int const>; bars.push_back(t2);
foo<int const>* t3 = dynamic_cast<foo<int const>*>(bars[0]);
std::cout << t3 << std::endl;
foo<int const>* t4 = dynamic_cast<foo<int const>*>(bars[1]);
std::cout << t4 << std::endl;
delete t1;
delete t2;
return 0;
}
为了将类型存储在结构中,我创建了foo
派生自bar
. 然后我可以将不同的类型int
和int const
(精确地指向类型foo<int>
和的对象的指针foo<int const>
)存储在 s 的向量中bar*
。然后对于给定的类型(此处int const
),我检查此向量中的每个元素是否可以动态转换为foo
具有此类型的 a。
运行此代码时,t3
将变为非空指针。但我也想拥有一个非空指针。nullptr
t4
t3
我希望我想做什么变得大致清楚。
您是否有任何想法如何在运行时实现这种可转换性检查(涉及 c++11 功能的解决方案完全可以)?