| 1 | #include <boost/variant.hpp>
|
|---|
| 2 | using namespace boost;
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 | class ptr_to_test_variant;
|
|---|
| 7 |
|
|---|
| 8 | typedef
|
|---|
| 9 | variant
|
|---|
| 10 | <
|
|---|
| 11 | int,
|
|---|
| 12 | ptr_to_test_variant
|
|---|
| 13 | >
|
|---|
| 14 | test_variant
|
|---|
| 15 | ;
|
|---|
| 16 |
|
|---|
| 17 | class ptr_to_test_variant
|
|---|
| 18 | {
|
|---|
| 19 | public:
|
|---|
| 20 | explicit
|
|---|
| 21 | ptr_to_test_variant(const test_variant& pointed_test_variant);
|
|---|
| 22 |
|
|---|
| 23 | ptr_to_test_variant(const ptr_to_test_variant& rhs);
|
|---|
| 24 |
|
|---|
| 25 | ~ptr_to_test_variant();
|
|---|
| 26 |
|
|---|
| 27 | ptr_to_test_variant&
|
|---|
| 28 | operator=(const ptr_to_test_variant& rhs);
|
|---|
| 29 |
|
|---|
| 30 | const test_variant&
|
|---|
| 31 | pointed_test_variant() const;
|
|---|
| 32 |
|
|---|
| 33 | private:
|
|---|
| 34 | test_variant* pointed_test_variant_;
|
|---|
| 35 | };
|
|---|
| 36 |
|
|---|
| 37 | bool
|
|---|
| 38 | operator==(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs);
|
|---|
| 39 |
|
|---|
| 40 | bool
|
|---|
| 41 | operator!=(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs);
|
|---|
| 42 |
|
|---|
| 43 |
|
|---|
| 44 |
|
|---|
| 45 | ptr_to_test_variant::ptr_to_test_variant(const test_variant& pointed_test_variant):
|
|---|
| 46 | pointed_test_variant_(new test_variant(pointed_test_variant))
|
|---|
| 47 | {
|
|---|
| 48 | }
|
|---|
| 49 |
|
|---|
| 50 | ptr_to_test_variant::ptr_to_test_variant(const ptr_to_test_variant& rhs):
|
|---|
| 51 | pointed_test_variant_(new test_variant(*rhs.pointed_test_variant_))
|
|---|
| 52 | {
|
|---|
| 53 | }
|
|---|
| 54 |
|
|---|
| 55 | ptr_to_test_variant::~ptr_to_test_variant()
|
|---|
| 56 | {
|
|---|
| 57 | delete pointed_test_variant_;
|
|---|
| 58 | }
|
|---|
| 59 |
|
|---|
| 60 | ptr_to_test_variant&
|
|---|
| 61 | ptr_to_test_variant::operator=(const ptr_to_test_variant& rhs)
|
|---|
| 62 | {
|
|---|
| 63 | delete pointed_test_variant_; //no more assertion failure if one comments this line
|
|---|
| 64 | pointed_test_variant_ = new test_variant(*rhs.pointed_test_variant_);
|
|---|
| 65 | return *this;
|
|---|
| 66 | }
|
|---|
| 67 |
|
|---|
| 68 | const test_variant&
|
|---|
| 69 | ptr_to_test_variant::pointed_test_variant() const
|
|---|
| 70 | {
|
|---|
| 71 | return *pointed_test_variant_;
|
|---|
| 72 | }
|
|---|
| 73 |
|
|---|
| 74 | bool
|
|---|
| 75 | operator==(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs)
|
|---|
| 76 | {
|
|---|
| 77 | return
|
|---|
| 78 | lhs.pointed_test_variant() == rhs.pointed_test_variant()
|
|---|
| 79 | ;
|
|---|
| 80 | }
|
|---|
| 81 |
|
|---|
| 82 | bool
|
|---|
| 83 | operator!=(const ptr_to_test_variant& lhs, const ptr_to_test_variant& rhs)
|
|---|
| 84 | {
|
|---|
| 85 | return !operator==(lhs, rhs);
|
|---|
| 86 | }
|
|---|
| 87 |
|
|---|
| 88 |
|
|---|
| 89 |
|
|---|
| 90 | int main()
|
|---|
| 91 | {
|
|---|
| 92 | test_variant tv1 = 88;
|
|---|
| 93 | test_variant ptr_to_tv1 = ptr_to_test_variant(tv1);
|
|---|
| 94 | test_variant ptr_to_ptr_to_tv1 = ptr_to_test_variant(ptr_to_tv1);
|
|---|
| 95 |
|
|---|
| 96 | const ptr_to_test_variant& direct_ptr_to_ptr_to_tv1 = get<ptr_to_test_variant>(ptr_to_ptr_to_tv1);
|
|---|
| 97 | ptr_to_ptr_to_tv1 = direct_ptr_to_ptr_to_tv1.pointed_test_variant();
|
|---|
| 98 | }
|
|---|
| 99 |
|
|---|