我有以下层次结构:
class base
{
public:
virtual ~base(){}
virtual void foo() {}
};
template <typename T>
class derived1 : public base
{
virtual void foo() {};
};
template <typename T>
class derived2 : public base
{
virtual void foo() {};
};
现在给出一个指向base的指针,我想知道底层是derived1还是derived2 . 问题是derived1和derived2都可以专门用于许多不同类型,使用dynamic_cast来测试向下转换需要知道模板类型 . 我最终得到了凌乱,不稳定和不完整的代码:
base* b = new derived1<int>();
if (dynamic_cast<derived1<int>*> ||
dynamic_cast<derived1<unsigned int>*> ||
dynamic_cast<derived1<double>*>)
std::cout << "is derived1";
else if (dynamic_cast<derived2<int>*> ||
dynamic_cast<derived2<unsigned int>*> ||
dynamic_cast<derived2<double>*>)
std::cout << "is derived2";
有没有更好的方法,可以处理任何类型的专业化?
4 回答
将依赖于类型的逻辑移动到类型中 .
代替:
将
virtual print_name() const
函数添加到base
,然后执行:在
base
和derived1
或derived2
之间插入一个非模板化的类:在评论中,你提到:
将该(虚拟)函数添加到
derived1_base
,您甚至不需要知道T
.NOTE :我考虑
dynamic_cast<>
a code smell 的清单,我建议你重新考虑一下你的方法 .您可以添加虚拟方法来执行某种类型的元类型检查:
解决方案1:再添加一个虚函数:
解决方案2:使用标记类: