#include <vector>
#include <iostream>
#include <typeinfo>
#include <memory.h>
using namespace std;
struct variant
{
size_t size;
void* p;
variant(const variant& v) {
p = new char[v.size];//этого не надо, и вообще этот оператор
size = v.size, memcpy(p, v.p, size);
cout << "copy\n";
}
template<typename T>
variant(T v) {
p = new T(v);
size = sizeof(T);
cout << "new\n";
}
template<typename T>
operator T&() {
return *(T*)p;
}
template<typename T>
T operator->() const { return *(T*)p; }
~variant() {
//delete p;
std::cout << "delete\n";
}
};
typedef enum { GUMBO_TAG_HTML, GUMBO_TAG_HEAD } GumboTag;
class tlist
{
public:
int axis;
variant node;
};
GumboTag f()
{
return GUMBO_TAG_HEAD;
}
int main(int argc, const char * argv[])
{
std::vector<tlist> tl;
tl.reserve(2);
int axis = 0;
std::cout << "push:\n";
tl.push_back({ axis, f() });//работает без tlist()
cout << static_cast<GumboTag>(tl[0].node) << "\n";
std::cout << "emplace:\n";
//tl.emplace_back({ axis, f() });
tl.emplace_back(tlist({ axis, f() }));
cout << static_cast<GumboTag>(tl[1].node) << "\n";
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCB2YXJpYW50CnsKICAgIHNpemVfdCBzaXplOwogICAgdm9pZCogcDsKICAgIHZhcmlhbnQoY29uc3QgdmFyaWFudCYgdikgewogICAgICAgIHAgPSBuZXcgY2hhclt2LnNpemVdOy8v0Y3RgtC+0LPQviDQvdC1INC90LDQtNC+LCDQuCDQstC+0L7QsdGJ0LUg0Y3RgtC+0YIg0L7Qv9C10YDQsNGC0L7RgAogICAgICAgIHNpemUgPSB2LnNpemUsIG1lbWNweShwLCB2LnAsIHNpemUpOwogICAgICAgIGNvdXQgPDwgImNvcHlcbiI7CiAgICB9CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdmFyaWFudChUIHYpIHsKICAgICAgICBwID0gbmV3IFQodik7CiAgICAgICAgc2l6ZSA9IHNpemVvZihUKTsKICAgICAgICBjb3V0IDw8ICJuZXdcbiI7CiAgICB9CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgb3BlcmF0b3IgVCYoKSB7CiAgICAgICAgcmV0dXJuICooVCopcDsKICAgIH0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBUIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAqKFQqKXA7IH0KICAgIH52YXJpYW50KCkgewogICAgICAgIC8vZGVsZXRlIHA7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJkZWxldGVcbiI7CiAgICB9Cn07Cgp0eXBlZGVmIGVudW0geyBHVU1CT19UQUdfSFRNTCwgR1VNQk9fVEFHX0hFQUQgfSBHdW1ib1RhZzsKY2xhc3MgdGxpc3QKewpwdWJsaWM6CiAgICBpbnQgYXhpczsKICAgIHZhcmlhbnQgbm9kZTsKfTsKCkd1bWJvVGFnIGYoKQp7CiAgICByZXR1cm4gR1VNQk9fVEFHX0hFQUQ7Cn0KCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICBzdGQ6OnZlY3Rvcjx0bGlzdD4gdGw7CiAgICB0bC5yZXNlcnZlKDIpOwogICAgaW50IGF4aXMgPSAwOwogICAgc3RkOjpjb3V0IDw8ICJwdXNoOlxuIjsKICAgIHRsLnB1c2hfYmFjayh7IGF4aXMsIGYoKSB9KTsvL9GA0LDQsdC+0YLQsNC10YIg0LHQtdC3IHRsaXN0KCkKICAgIGNvdXQgPDwgc3RhdGljX2Nhc3Q8R3VtYm9UYWc+KHRsWzBdLm5vZGUpIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgImVtcGxhY2U6XG4iOwogICAgLy90bC5lbXBsYWNlX2JhY2soeyBheGlzLCBmKCkgfSk7CiAgICB0bC5lbXBsYWNlX2JhY2sodGxpc3QoeyBheGlzLCBmKCkgfSkpOwogICAgY291dCA8PCBzdGF0aWNfY2FzdDxHdW1ib1RhZz4odGxbMV0ubm9kZSkgPDwgIlxuIjsKfQ==