1

这是我的问题的抽象。

我想开发这样的东西。

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& 输入),但同样不能像这样工作:

class Base {
   virtual f() = 0;
}

那么你是怎么做到的呢?一般来说,我想要一个指向通用 TypedBase 的指针,它允许我通过指向族的通用指针调用 f(...) 。有什么想法吗?

我当然可以这样做:

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

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

4

1 回答 1

1

您必须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);
于 2013-01-29T22:51:52.237 回答