我想寫的很簡單任何對象,它可以容納任何類型的對象。我希望它在容器內部使用,來實現異構容器。在「異構對象」類中複製構造函數
#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
被破壞,所以指針被刪除,並且推送的對象不再有效。
所以我有2個問題:
1,如何編寫類中的任何拷貝構造函數?
2,爲什麼不是無名Any
在BLOCK1破壞,因此它的指針不會被刪除?\
編輯 我曾嘗試
template <typename T>
Any(const Any & rhs)
:p(new storageImpl<T>(rhs.get()))
{
}
但它不會被觸發。
如果您不知道,已經有[Boost.Any](http://www.boost.org/doc/libs/1_51_0/doc/html/any.html)。 – kennytm
@KennyTM我知道,但我不想使用提升。 – relaxxx