typeName::typeName(const typeName &that) \
: privateName(std::make_unique<decltype(privateName)::element_type>(*(that.privateName))) \
{ \
} \
typeName::typeName(typeName &&that) \
: privateName(std::move(that.privateName)) \
{ \
} \
typeName &typeName::operator=(const typeName &that) \
{ \
if (privateName != that.privateName) { \
privateName.reset(); \
privateName = std::make_unique<decltype(privateName)::element_type>(*(that.privateName)); \
} \
return *this; \
} \
typeName &typeName::operator=(typeName &&that) \
{ \
if (privateName != that.privateName) { \
privateName.reset(); \
privateName = std::move(that.privateName); \
} \
return *this; \
}