我有以下情况:
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/