, - union boost::variant<>.
, , POD boost::optional<> :
template <typename T>
class Optional
{
T value;
bool valid;
public:
// for the if(var) test
operator bool() const { return valid; }
// for assigning a value
Optional<T> &operator=(T rhs)
{
value = rhs;
valid = true;
return *this;
}
// for assigning "empty"
Optional<T> &operator=(void *)
{
valid = false;
return *this;
}
// non-const accessors
T &operator*() { return value; }
T *operator->() { return &value; }
// const accessors
const T &operator*() const { return value; }
const T *operator->() const { return &value; }
};
- , const Optional<>.
, Optional<T> , ( ).
boost::optional<T>, Optional<T> T Optional<T>.
value null , operator Optional<T>(). .
Optional<details> additional_info;
Optional<details> more_info(additional_info);
// if there no additional info
additional_info = 0;
// if there is extended info
details x;
// ...populate x...
additional_info = x;
if( extended_info )
{
extended_info->member;
// - or -
details &info = *extended_info;
}
- . , .