I'd like to have a nonignorable-type that could be used to wrap return values that must be handled, but using an exception would be to heavy-weight.
Consider:
bool IntersectLineAndPlane(...);
I'd like to say
nonignorable<bool> IntersectLineAndPlane(...);
And then have code that doesn't handle the return value give a compile-time error (or warning) so that mistakes don't slip through into production code.
You would think that perhaps something like this would work:
template <typename T>
class nonignorable {
public:
nonignorable(const T& v) : value_(v) {}
// check() does the destruction and extracts the value
friend T check(const nonignorable<T>&);
private:
~nonignorable();
};
This could be used as:
nonignorable<bool> Function() {
return nonignorable(false);
}
And in client code:
if (!check(Function)) { /* take action */ }
Alas, this will not work, because there are more destructions going on when the nonignorable instance is returned on the stack. I think the only way to solve this is to rely on the new C++0x proposition to add move semantics into the language so that there is only one destruction (in the check() template function).