我有以下情况:

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的构造函数的对象的静态类型。尤其是:

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/

10-11 06:54