Если вы не против некоторых бросков, и производительность определенно является проблемой, вы можете сделать что-то вроде этого:
class Object {
bool original; // True if "original" object, false if copy.
intptr_t value;
public:
Object(int val) : original(true), value(val) {}
Object(const Object& other) : original(false),
value(reinterpret_cast<intptr_t>(&other.value));
intptr_t getValue() const {
return original ? value : *reinterpret_cast<intptr_t*>(value);
}
};
Избегает динамического выделения, не использует много памяти, но делает некоторые приведения указателей, поэтому, очевидно, будьте осторожны. И, конечно, это зависит от поддержки intptr_t
, которая является необязательной для стандартных реализаций библиотеки.
std :: shared_ptr, безусловно, является более надежным способом решения этой проблемы, поэтому, если производительность не является критической проблемой или вы используете большие типы, пожалуйста, рассмотрите возможность ее использования.