fork(1) download
  1. #include <vector>
  2. #include <iostream>
  3. #include <typeinfo>
  4. #include <memory.h>
  5.  
  6. using namespace std;
  7. struct variant
  8. {
  9. size_t size;
  10. void* p;
  11. variant(const variant& v) {
  12. p = new char[v.size];//этого не надо, и вообще этот оператор
  13. size = v.size, memcpy(p, v.p, size);
  14. cout << "copy\n";
  15. }
  16. template<typename T>
  17. variant(T v) {
  18. p = new T(v);
  19. size = sizeof(T);
  20. cout << "new\n";
  21. }
  22. template<typename T>
  23. operator T&() {
  24. return *(T*)p;
  25. }
  26. template<typename T>
  27. T operator->() const { return *(T*)p; }
  28. ~variant() {
  29. //delete p;
  30. std::cout << "delete\n";
  31. }
  32. };
  33.  
  34. typedef enum { GUMBO_TAG_HTML, GUMBO_TAG_HEAD } GumboTag;
  35. class tlist
  36. {
  37. public:
  38. int axis;
  39. variant node;
  40. };
  41.  
  42. GumboTag f()
  43. {
  44. return GUMBO_TAG_HEAD;
  45. }
  46.  
  47. int main(int argc, const char * argv[])
  48. {
  49. std::vector<tlist> tl;
  50. tl.reserve(2);
  51. int axis = 0;
  52. std::cout << "push:\n";
  53. tl.push_back({ axis, f() });//работает без tlist()
  54. cout << static_cast<GumboTag>(tl[0].node) << "\n";
  55. std::cout << "emplace:\n";
  56. //tl.emplace_back({ axis, f() });
  57. tl.emplace_back(tlist({ axis, f() }));
  58. cout << static_cast<GumboTag>(tl[1].node) << "\n";
  59. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
push:
new
copy
delete
1
emplace:
new
copy
delete
1
delete
delete