是否有一个被接受的习惯用于为对象分配后备存储而不是初始化它?这是我天真的解决方案:
#include <utility>
template<typename T>
union Slot {
T inst;
Slot() {}
~Slot() {}
template<typename... Args>
T* init(Args&&... args) { return new(&inst) T(std::forward<Args>(args) ...); }
void release() { inst.~T(); }
};
我的直接用例是针对对象池,但它通常也会更有用。
答案 0 :(得分:4)
在C ++ 11中,您可以使用std::aligned_storage
(see also):
template<typename T>
struct Slot {
typename std::aligned_storage<sizeof(T)>::type _storage;
Slot() {}
~Slot() {
// check if destroyed!
...
}
template<typename... Args>
T* init(Args&&... args) {
return new(address()) T(std::forward<Args>(args) ...);
}
void release() { (*address()).~T(); }
T* address() {
return static_cast<T*>(static_cast<void*>(&_storage));
}
};