Проблема в том, что ваш класс пытается сделать слишком много. Либо используйте ресурс, либо управляйте ресурсом. Вы никогда не сделаете и то и другое, потому что ваш код станет небезопасным, куча ошибок. И это не хорошо.
Вам необходимо разработать класс, который управляет ресурсом, который копируется только при определенных условиях. На самом деле вы еще не поняли, на чем основаны эти условия и почему они существуют (это очень странный способ «копировать» данные, вы уверены, что это лучший маршрут?), Но это было бы что-то как это:
// pointer to your condition member (not sure if this is even needed,
// is this condition knowable via the pointer alone? you get the point)
template <typename T, typename D, class Tag = void>
class copy_conditional_ptr
{
public:
copy_conditional_ptr(bool (D::*condition)(T*) const, T* value = 0) :
mCondition(condition),
mValue(value)
{}
// here's where the unique copy-semantics go
copy_conditional_ptr(const copy_conditional_ptr& other) :
mCondition(other.mCondition),
mValue(do_copy(other.mValue) ? other.mValue : 0)
{}
// other stuff for a smart pointer,
// copy-and-swap, etc...
protected:
// protected because it's meant to be a base class
~copy_conditional_ptr()
{
// whatever
}
private:
bool do_copy(T* value) const
{
const D& self = static_cast<const D&>(*this);
return (self.*mCondition)(other.value);
}
bool (D::*mCondition)(T*) const;
T* mValue;
};
Тогда вы используете это так:
class xyz;
class C : private copy_conditional_ptr<xyz, C>
{
public:
C() :
/* others, */
copy_conditional_ptr(&C::CanCopy)
{}
private:
int a, b, c;
std::set<int> mySet;
};
И пусть управление будет автоматическим для остальной части класса. Тег, чтобы вы могли иметь несколько в одном классе:
class C : private copy_conditional_ptr<xyz, C, struct C_first>,
private copy_conditional_ptr<xyz, C, struct C_second>
{
// ...
};