我正在尝试编写非常简单的 Any 对象,它可以容纳任何类型的对象。我希望它在容器内使用,以实现异构容器。
#include <iostream>
#include <vector>
#include <string>
struct Any
{
template < typename T >
Any(const T & t)
:p(new storageImpl<T>(t)) { }
~Any()
{
delete p;
}
struct storage
{
virtual ~storage() {}
};
template <typename T>
struct storageImpl : storage
{
storageImpl(const T & t) : data(t) {}
T data;
};
template <typename T>
T & get()
{
storageImpl<T> * i = static_cast<storageImpl<T>*>(p);
return i->data;
}
storage * p;
};
用法
int main ()
{
//block1
Any copy(Any(std::string("foo")));
std::cout << copy.get<std::string>();
//block2
std::vector<Any> cont;
cont.push_back(Any(5));
cont.push_back(Any(37.9f));
std::cout << cont[0].get<int>();
std::cout << cont[1].get<float>();
}
我有复制构造的问题。
当我推Any
入向量(//block2)时,未命名Any
的被破坏,因此指针被删除,推入的对象不再有效。
所以我有两个问题:
1、Any类的拷贝构造函数怎么写?
2、为什么Any
block1中的unnamed没有被销毁,所以它的指针没有被删除?\
编辑我试过
template <typename T>
Any(const Any & rhs)
:p(new storageImpl<T>(rhs.get()))
{
}
但它不会被触发。