gpt4 book ai didi

c++ - 通过基指针访问派生类中的模板化函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:10 28 4
gpt4 key购买 nike

这是我的问题的抽象。

我想开发这样的东西。

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);

这不会编译。

我尝试向 base 添加一个空虚函数 f(),希望 vtable 能够在运行时调用正确的 f() 与 f(T& input),但同样无法正常工作:

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 个要处理的类型,那么我将不得不向 Base 类添加 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);

关于c++ - 通过基指针访问派生类中的模板化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318157/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com