通过基本指针访问派生类中的模板功能

Accessing a templated functions in a derived class via a base pointer

本文关键字:功能 派生 指针 访问      更新时间:2023-10-16

这是我问题的抽象。

我想开发这样的东西。

class Base {
}
template<typename T>
class TypedBase : Base {
    f(const T& input);
}

现在,我想通过基本指针访问类typedbase的"家族",并致电f。

类似这样的东西

Base* base_ptr;
if (condition) {
  base_ptr = new TypedBase<double>();
} else {
  base_ptr = new TypedBase<int>();
}
// Int and double are just examples to get the idea
// Then I Want to call
base_ptr->f(4);

这不会编译。

我尝试在运行时添加一个空的虚拟函数f(),以希望VTable可以照顾正确的F()与F(T&amp; Intup),但再次无法正常工作:

class Base {
   virtual f() = 0;
}

那你怎么做?总的来说,我想有一个指向通用键入的指针,该指针使我可以通过通用指针致电F(...)。有任何想法吗?

当然我可以这样做:

class Base {
    // Repeat for every typename
    virtual f(int& x) = 0;
    virtual f(double& x) = 0;
} 

,然后每个TypedBase只会实现其中一个,因此我仍然会在运行时获得类型的安全性,而无需在代码中进行动态检查。但是,如果我有n个函数要调用和M类型可以使用,那么我将不得不在基类中添加m*n抽象功能。有更好的解决方案吗?

您必须static_cast(如果您知道实际类型)或dynamic_cast(如果您需要检查是否成功)将基本指针指向正确的类。如果您知道要传递给方法的内容,那么将参数的施法施放到键入的情况下应该不是问题。铸件也应使用正确的模板类型来使用模板方法。

以下编译?

template <typename T>
void callF(Base *p, T input) {
  TypedBase<T> *tp = dynamic_cast<TypedBase<T>*>(p);
  if (tp) tp->f(input);
  // else throw exception or call some Base method or return error or...
}

或更少的安全,只需:

static_cast<TypedBase<int>*>(base_ptr)->f(1);