这在 C++ 中不可能,但在 Java/Python 中可能是因为:在 C++ 向量中,STL 容器的存储(由 vector::data() 返回)包含顺序打包的所有对象实例。其中每个元素必须具有相同的大小。这使得寻址快速方便。因此,假设您定义了一个模板类 A,
template <class T>
class A{
int id;
T obj;
};
它的大小将取决于模板变量“T obj”。推送不同模板类型 T 的同一个类 A 会使向量中的每个元素具有不同的大小,因此,这是不可能的。唯一的方法是使用基类的 shared_ptr 或 unique_ptr 的向量。C++11 和 Boost 都支持 shared_ptr 和 unique_ptr。每个派生类元素可以有不同的模板类型。这样,当基类指针的析构函数被调用时,派生类的析构函数就会被调用。例如,
#include <memory>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
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));
}
请记住使用 -std=c++11 进行编译以启用 C++11。
输出:
Deleting string1234
Deleting 1234
Deleting 1.234
你得到你想要的!:)
在 Java/Python 中,每个类对象变量实际上都是一个指针,因此,A 的 Java 数组或 A 的 Python 列表等效于 A 的指针的 C++ 数组。因此,无需显式创建即可获得基本相同的功能shared_ptrs。