casa
$Rev:20696$
|
Mark a value as valid or invalid. More...
#include <Fallible.h>
Public Member Functions | |
Fallible () | |
The default constructor creates an invalid object. | |
Fallible (const T &value) | |
Create a valid object. | |
Fallible (const Fallible< T > &other) | |
Fallible< T > & | operator= (const Fallible< T > &other) |
~Fallible () | |
operator T () const | |
Automatically convert a Fallible<T> to a T . | |
T | value () const |
Sometimes it's more convenient to not rely on a compiler supplied conversion, especially when the compiler is confused. | |
Bool | isValid () const |
Private Attributes | |
T | value_p |
Bool | isValid_p |
Mark a value as valid or invalid.
Public interface
This is to be used for values which might be fallible, i.e. might not be valid.
This class resembles the one in Scientific and Engineering C++ by Barton and Nackman. While it was written with that book closed, the class is simple enough that resemblances likely remain.
This class essentially just holds a value (with automatic conversion) and allows inquiry as to whether the value is valid. If the value is used and is indeed invalid an exception will be thrown.
A copy of the value is stored in the Fallible<T>
object, so making copies shouldn't be too expensive. It is anticipated that this class will most often be used with built in, or other small, types.
Suppose we write some code that turns a day/month/year into a day of the week:
enum DayName {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; Fallible<DayName> dayFromDate(uInt day, uInt month, uInt year); // a func.
And we also have some other function that needs a day name, for example just prints it:
ostream &operator<<(ostream &os, DayName day); // Print name as string
Since the automatic conversions are defined, if we are certain that the dates are valid, we can just go ahead and use the value:
cout << dayFromData(2, 1, 1962) << endl; // A valid date
If, by some chance, you are wrong and a date fails, then an exception will be thrown and a run-time error will occur.
If, as is more likely the case, you don't know a priori whether a test will succeed, you can check it:
Fallible<DayName> result = dayFromDate(d,m,y); // who knows if valid? if (result.isValid()) { cout << result << endl; } else { // some corrective action }
The alternatives are to have "special values" (e.g. have an "undefined
day" in the enumeration) or return a Boolean, or change a Boolean. While those solutions are often adequate, Fallible<T>
can often be more natural.
Definition at line 122 of file Fallible.h.
casa::Fallible< T >::Fallible | ( | ) | [inline] |
The default constructor creates an invalid object.
Definition at line 126 of file Fallible.h.
casa::Fallible< T >::Fallible | ( | const T & | value | ) | [inline] |
Create a valid object.
Definition at line 129 of file Fallible.h.
casa::Fallible< T >::Fallible | ( | const Fallible< T > & | other | ) | [inline] |
Definition at line 132 of file Fallible.h.
casa::Fallible< T >::~Fallible | ( | ) | [inline] |
Definition at line 139 of file Fallible.h.
Bool casa::Fallible< T >::isValid | ( | ) | const [inline] |
Definition at line 150 of file Fallible.h.
References casa::Fallible< T >::isValid_p.
casa::Fallible< T >::operator T | ( | ) | const [inline] |
Automatically convert a Fallible<T>
to a T
.
Definition at line 142 of file Fallible.h.
References casa::Fallible< T >::isValid_p, and casa::Fallible< T >::value_p.
Fallible<T>& casa::Fallible< T >::operator= | ( | const Fallible< T > & | other | ) | [inline] |
Definition at line 135 of file Fallible.h.
References casa::Fallible< T >::isValid_p, and casa::Fallible< T >::value_p.
T casa::Fallible< T >::value | ( | ) | const [inline] |
Sometimes it's more convenient to not rely on a compiler supplied conversion, especially when the compiler is confused.
Definition at line 147 of file Fallible.h.
References casa::Fallible< T >::isValid_p, and casa::Fallible< T >::value_p.
Bool casa::Fallible< T >::isValid_p [private] |
Definition at line 153 of file Fallible.h.
Referenced by casa::Fallible< T >::isValid(), casa::Fallible< T >::operator T(), casa::Fallible< T >::operator=(), and casa::Fallible< T >::value().
T casa::Fallible< T >::value_p [private] |
Definition at line 152 of file Fallible.h.
Referenced by casa::Fallible< T >::operator T(), casa::Fallible< T >::operator=(), and casa::Fallible< T >::value().