c++ - C++ dynamic_cast 一个模板类到另一个模板
问题描述
我正在使用模板类A<widget_type>
,我想知道是否可以dynamic_cast<A<another_type>*>(A<widget_type>*)
。问题:在下面的代码中,A<B>* target2 = dynamic_cast<A<B>*>(&source);
返回一个空指针。是否可以将模板类转换为同一个类但使用另一个模板?编辑:我必须制作一个数组保存A<B*>
对象的程序,但A<B*>
对象可能来自A<C*>
or A<D*>
。我需要在运行时检查是否A<B*>
可以将其转换为所需的模板类。出于这个原因,我不能使用强类型,因为A<B*>
对象可能来自一个A<E*>
对象,E
其他人可能创建的类在哪里,因此,可能没有转换函数到该模板类。代码:
template<typename widget_type>
class A
{
public:
std::vector<widget_type*> value;
virtual ~A() {}
void Add(widget_type* val)
{
value.push_back(val);
}
template<typename return_type>
operator A<return_type>()
{
unsigned int size = this->value.size();
std::vector<return_type*> return_value;
return_value.resize(size);
for (unsigned int i = 0; i < size; i++)
{
return_value[i] = dynamic_cast<return_type*>(this->value[i]);
}
A<return_type> target;
target.value = return_value;
return target;
}
};
class B
{
public:
virtual ~B() {}
};
class C : public B
{
public:
void Print()
{
std::cout << "C CALL\n";
}
};
class D : public B
{
};
int main()
{
std::cout << "Start!\n";
A<C> source;
C* val1 = new C;
source.Add(val1);
A<B> target = source;
A<B>* target2 = dynamic_cast<A<B>*>(&source);
if (target2)
{
std::cout << "POINTER\n";
}
std::cout << "END\n";
}```
解决方案
只有当你来自哪里和你要去哪里之间存在某种继承关系时,dynamic_cast 才会成功。
如果您只是想将一种类型的指针视为指向不同类型的指针(这通常适用于同一模板的不同专业化),那么 dynamic_cast 将不会成功。只有 c 样式或 reinterpret_cast 将允许强制转换,但即使这样,结果也没有定义。
推荐阅读
- cpanel - 跟踪从 cPanel 终端对系统的访问
- abp - 使用带有 abp 的 ocelot 时如何将租户 ID 发送到下游服务
- javascript - 如何使用javascript将excel中的工作表保存为新的excel文件
- javascript - 无法从主动选择反应参数传递多选复选框值
- keras - 如何在带有 tensorflow 2 keras 的自定义 train_step 中使用 if 条件
- algorithm - 当数组大小为常数值时对数组进行排序的时间复杂度
- php - 如何在 Laravel 中使用代码状态码 404 抛出 NotFoundResourceException
- r - 使用 R 对具有重复 K 倍的数据集使用逻辑回归
- r - 如何纠正cut方法的错误结果?
- javascript - TypeError:无法读取未定义的属性“名称”,无法遍历对象数组