#include <memory>
#include <vector>
#include <boost/variant.hpp>
 
using namespace std;
 
class holder;
struct v_with_holder {
	// a bunch of fields
    std::unique_ptr<holder> ph;
    holder& h;
 
    friend void swap(v_with_holder& first, v_with_holder& second) 
    {
    	using std::swap;
    	// swap a bunch of fields
    	swap(first.ph, second.ph);
    }
 
    v_with_holder(); 
    ~v_with_holder();
    v_with_holder(const v_with_holder& other);
    v_with_holder(v_with_holder&& other);
    v_with_holder& operator=(v_with_holder other);
};
 
typedef boost::variant</* such types, */v_with_holder/*, many others */> struct_v;
 
class holder { public: std::vector<struct_v> ss; };
 
v_with_holder::v_with_holder() : ph(new holder), h(*ph) { }
v_with_holder::~v_with_holder() { }
v_with_holder::v_with_holder(const v_with_holder& other) : ph(new holder), h(*ph)
{
	// copy a bunch of fields
	h = other.h;
}
v_with_holder::v_with_holder(v_with_holder&& other) : v_with_holder()
{
	swap(*this, other);
}
v_with_holder& v_with_holder::operator=(v_with_holder other)
{
	swap(*this, other);
	return *this;
}
 
int main() {
	holder h1, h2;
	v_with_holder x;
	x.h = h2;
	h1.ss.push_back(x);
	return 0;
}
 
				I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGJvb3N0L3ZhcmlhbnQuaHBwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIGhvbGRlcjsKc3RydWN0IHZfd2l0aF9ob2xkZXIgewoJLy8gYSBidW5jaCBvZiBmaWVsZHMKICAgIHN0ZDo6dW5pcXVlX3B0cjxob2xkZXI+IHBoOwogICAgaG9sZGVyJiBoOwogICAgCiAgICBmcmllbmQgdm9pZCBzd2FwKHZfd2l0aF9ob2xkZXImIGZpcnN0LCB2X3dpdGhfaG9sZGVyJiBzZWNvbmQpIAogICAgewogICAgCXVzaW5nIHN0ZDo6c3dhcDsKICAgIAkvLyBzd2FwIGEgYnVuY2ggb2YgZmllbGRzCiAgICAJc3dhcChmaXJzdC5waCwgc2Vjb25kLnBoKTsKICAgIH0KICAgIAogICAgdl93aXRoX2hvbGRlcigpOyAKICAgIH52X3dpdGhfaG9sZGVyKCk7CiAgICB2X3dpdGhfaG9sZGVyKGNvbnN0IHZfd2l0aF9ob2xkZXImIG90aGVyKTsKICAgIHZfd2l0aF9ob2xkZXIodl93aXRoX2hvbGRlciYmIG90aGVyKTsKICAgIHZfd2l0aF9ob2xkZXImIG9wZXJhdG9yPSh2X3dpdGhfaG9sZGVyIG90aGVyKTsKfTsKCnR5cGVkZWYgYm9vc3Q6OnZhcmlhbnQ8Lyogc3VjaCB0eXBlcywgKi92X3dpdGhfaG9sZGVyLyosIG1hbnkgb3RoZXJzICovPiBzdHJ1Y3RfdjsKCmNsYXNzIGhvbGRlciB7IHB1YmxpYzogc3RkOjp2ZWN0b3I8c3RydWN0X3Y+IHNzOyB9OwoKdl93aXRoX2hvbGRlcjo6dl93aXRoX2hvbGRlcigpIDogcGgobmV3IGhvbGRlciksIGgoKnBoKSB7IH0Kdl93aXRoX2hvbGRlcjo6fnZfd2l0aF9ob2xkZXIoKSB7IH0Kdl93aXRoX2hvbGRlcjo6dl93aXRoX2hvbGRlcihjb25zdCB2X3dpdGhfaG9sZGVyJiBvdGhlcikgOiBwaChuZXcgaG9sZGVyKSwgaCgqcGgpCnsKCS8vIGNvcHkgYSBidW5jaCBvZiBmaWVsZHMKCWggPSBvdGhlci5oOwp9CnZfd2l0aF9ob2xkZXI6OnZfd2l0aF9ob2xkZXIodl93aXRoX2hvbGRlciYmIG90aGVyKSA6IHZfd2l0aF9ob2xkZXIoKQp7Cglzd2FwKCp0aGlzLCBvdGhlcik7Cn0Kdl93aXRoX2hvbGRlciYgdl93aXRoX2hvbGRlcjo6b3BlcmF0b3I9KHZfd2l0aF9ob2xkZXIgb3RoZXIpCnsKCXN3YXAoKnRoaXMsIG90aGVyKTsKCXJldHVybiAqdGhpczsKfQoKaW50IG1haW4oKSB7Cglob2xkZXIgaDEsIGgyOwoJdl93aXRoX2hvbGRlciB4OwoJeC5oID0gaDI7CgloMS5zcy5wdXNoX2JhY2soeCk7CglyZXR1cm4gMDsKfQo=