Итак, у меня есть класс, с которым я намеревался использовать std::aligned_storage
для хранения различных типов до 16 байтов для класса «Вариант». Теоретически он должен иметь возможность хранить любой тип POD и обычные контейнеры, такие как std::string
и std::map
.Как уничтожить типы без деструктора, созданные с помощью «Размещение нового»
Я пошел на примере кода находится здесь, и казалось, что это было сделано именно то, что я искал: http://en.cppreference.com/w/cpp/types/aligned_storage
Моя версия, в основном:
class Variant {
public:
Variant() { /* construct */ }
Variant(std::map<int,int> v) {
new(&m_data) std::map<int,int>(v); // construct std::map<int,int> at &m_data
m_type = TYPE_MAP;
}
~Variant() {
if (m_type == TYPE_MAP) {
// cool, now destruct..?
reinterpret_cast<std::map<int, int>*>(&m_data)->~/*???????????????*/();
}
}
private:
// type of object in m_data
enum Type m_type;
// chunk of space for allocating to
std::aligned_storage<16, std::alignment_of<std::max_align_t>::value>::type m_data;
};
Моя проблема возникает с разрушение. Как вы можете видеть на /*???????????????*/
, я не уверен, что называть вместо ~T()
в примере cppreference.com:
reinterpret_cast<const T*>(data+pos)->~T(); // I did the same thing except I know what T is, is that a problem is it?
На мой взгляд, я делаю точно то же самое, не обращая внимания шаблон анонимности. Проблема заключается в том, что std::map
не имеет метода деструктора std::map::~map()
, только std::map::~_Tree
, который явно не предназначен для непосредственного использования. Итак, в примере кода cppreference.com, что бы вызывать ~T()
, если T
был std::map<int,int>
, и каков подходящий способ для меня назвать деструктор для объекта с известным типом в std::aligned_storage
? Или я слишком усложняю вещи, и методы clear()
в этих контейнерах STL гарантируют выполнение эквивалента полного уничтожения?
Или, есть ли более простой способ обойти это? Как я, возможно, неправильно понял что-то по поводу моего предполагаемого использования std::aligned_storage
.
Что заставляет вас думать, что нет 'std :: map :: ~ map()'? Конечно. – Brian
А, я собирался спросить, было ли это вообще связано с моим компилятором, но, должно быть, отредактировал его. Итак, я рассматриваю проблему с поддержкой Visual Studio 2015 C++ 11 или что-то здесь? Поскольку в файле заголовка почти нет ни одного ... @Brian – Deji
Все классы имеют деструктор (компилятор неявно объявляет, если вы этого не делаете), и вы также можете использовать синтаксис '~ T()' для типов неклассов, для которых он определен как нет-op –