gpt4 book ai didi

c++ - 通过非模板化基类的模板化多态性

转载 作者:行者123 更新时间:2023-11-28 03:42:14 24 4
gpt4 key购买 nike

我有以下情况:

class Base2
{
};

class Base1
{
virtual void f()=0;
protected:
boost::shared_ptr<Base2> base2Ptr;
};


class Derived1 : public Base1
{
Base1(boost::shared_ptr<Base2> b2) : base2Ptr(b2) { }

void f()
{
/* Here I would like to know the derived type of base2Ptr */
}
}

template<typename T>
class Derived2 : public Base2
{
typedef T result_type;
}

最佳答案

(我在 ideone 上放了一些代码(编辑后有一些虚拟析构函数。这很重要,这样 shared_ptr 才能在示例中正确地析构 DoublyDerived2。))

根据对问题的评论,我认为最终目标是让 Derived1 的构造函数以某种方式“知道”并“记住”传递给 Derived1 的构造函数的对象的 static 类型.特别是:

Derived2<string> *p = new DoublyDerived2<string>();
// static type of p is Derived2, not DoublyDerived
shared_ptr<Base1> x = something_that_creates_a_Derived1(p);

Derived1 对象应该知道 p 是 Derived2 类型,而不仅仅是 Base2 类型

假设这是对问题的正确理解,ideone 上的代码应该可以解决它。主要技巧是 make_Derived1 是一个模板,并且在创建 Derived1 时使用推导的类型。 Derived1 本身是一个模板,确保其 foo 方法知道类型。

template <class T>
shared_ptr<Base1> make_Derived1(shared_ptr<T> ptr) {
cout << typeid(ptr).name() << endl;
return shared_ptr<Base1>(new Derived1<T>(ptr));
}

和用法:

int main() {
shared_ptr< Derived2<string> > p ( new DoublyDerived2<string>() ) ;
shared_ptr<Base1> x = make_Derived1(p);
x->f(); // prints something like "Derived2", as desired.
}

关于c++ - 通过非模板化基类的模板化多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8780013/

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