c++ - 从基指针向下转换为模板派生类型

标签 c++ inheritance metaprogramming dynamic-cast downcast

我有以下层次结构:

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() {};
};

现在给定一个指向基的指针,我想知道是否 underlying 是 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";

有没有更好的方法可以处理任何类型的特化?

最佳答案

将依赖类型的逻辑移到类型中。

代替:

if (dynamic_cast<derived1<int>*>(b) ||
    dynamic_cast<derived1<unsigned int>*>(b) ||
    dynamic_cast<derived1<double>*>(b))
  std::cout << "is derived1";
else if (dynamic_cast<derived2<int>*>(b) ||
    dynamic_cast<derived2<unsigned int>*>(b) ||
    dynamic_cast<derived2<double>*>(b))
  std::cout << "is derived2";

virtual print_name() const 函数添加到base,然后执行:

void example() {
    std::unique_ptr<base> b(new derived1<int>());
    b->print_name();
}
class base
{
public:
   ~base(){}
   virtual void foo() {}
   virtual void print_name() const = 0;
};

template <typename T>
class derived1 : public base
{
   virtual void foo() {}
   virtual void print_name() const {
       std::cout << "is derived1";
   }
};

template <typename T>
class derived2 : public base
{
   virtual void foo() {}
   virtual void print_name() const {
       std::cout << "is derived2";
   }
};

关于c++ - 从基指针向下转换为模板派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9560861/

相关文章:

c++ - 在 C++ 中使用迭代器时如何获取循环数?

c++ - 你应该为 std::unordered_map 迭代器使用引用吗?

c++ - 有什么方法可以对成员变量执行 std::upper_bound 吗?

java - Java 中的动态继承

c++ - 是否可以在编译时检查类型是否派生自模板的某些实例化?

c++ - 获取此对象的原始类型

c# - 创建一个虚拟 HWND 以传递给 Direct3D

c++ - 无法调用继承的 protected 泛型类成员

c++ - 使用枚举作为模板参数

c++ - 模板模板类型的计数参数