【发布时间】:2019-12-04 14:13:37
【问题描述】:
通过实现这个答案,我有一个模板类的各种对象的向量:https://stackoverflow.com/a/36588158/5088457
我正在使用 qt 进行开发。但是我在投射/访问这些对象时遇到了麻烦。所以我的问题是,当我不知道模板类型时,如何获取 shared_ptr 后面的对象?正如您在下面的代码 sn-p 中看到的,它是关于从向量 As 中获取一个 AImpl 对象。谢谢!
我认为作者的代码 sn-p 是一个很好的最小示例:
class A{};
template <class T>
class AImpl : public A{
public:
T obj;
AImpl(T _obj):obj(_obj){}
~AImpl(){
cout << "Deleting " << obj << endl;
}
};
int main(int argc, char** argv)
{
AImpl <string>* a1 = new AImpl <string> ("string1234");
AImpl <int>* a2 = new AImpl <int> (1234);
AImpl <double>* a3 = new AImpl <double> (1.234);
vector <shared_ptr<A>> As;
As.push_back(shared_ptr<A>(a1));
As.push_back(shared_ptr<A>(a2));
As.push_back(shared_ptr<A>(a3));
}
【问题讨论】:
-
类型擦除不是什么神奇的武器。是的,您将所有这些对象放入一个向量中——但是为什么呢?你真正想要完成什么? C++ 是一种强类型语言,所以要对你的对象做任何有用的事情,你需要以某种方式再次记住/找出正确的类型。如果您没有办法做到这一点,那么类型擦除可能不是正确的解决方案。
-
换句话说:你告诉我们你用了一把锤子,钉子现在卡在木头上,你想把它弄回来。有很多方法可以使钉子重新拔出。其中一些速度很慢。其中一些涉及破坏木材。但是我们不能给你一个有用的答案,因为我们不知道你为什么把钉子放在那里,又把它们弄出来的目的是什么。也许您实际上并不需要锤子和木头?这看起来像XY problem,所以我建议你首先描述一下你真正想要完成的事情。