This function gets called when an invalid object is accessed. It just throws an exception. Since we have inline functions, let's keep the throw out of them to keep them from moving out of line.
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.
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
}
Create a valid object
Automatically convert a Fallible<T> to a T.
Sometimes it's more convenient to not rely on a compiler supplied conversion, especially when the compiler is confused.