Re: How do you solve the general missing-value problem?
Am 08.07.2012 18:57, schrieb DeMarcus:
Sometimes you need to inform that the value is missing. Some use
pointers to objects where NULL represents the missing value. Another
solution is to use boost::optional.
The only other variant I could imagine is an empty container, which is
rather similar to boost::optional.
However, sometimes you need to provide more second level information
than just missing value. How do you solve that?
I came up with an idea below. Is that a good solution or are there
better ways to solve it? Does any library have anything similar? What
can be improved? Any feedback is welcome.
[...]
enum Signal
{
NOT_AVAILABLE,
AVAILABLE,
WEAK,
DISTORTED
};
typedef Multivalence<
double,
Signal,
NOT_AVAILABLE,
AVAILABLE> SignalDouble;
SignalDouble getSample()
{
//return SignalDouble(); // Missing value.
return SignalDouble( 8.75 ); // Good value.
//return SignalDouble( DISTORTED ); // Distorted value.
}
int main( int argc, char* argv[] )
{
SignalDouble sample = getSample();
switch( sample )
{
case NOT_AVAILABLE:
std::cout << "No sample available" << std::endl;
break;
case AVAILABLE:
std::cout << "Sample: " << *sample << std::endl;
break;
case WEAK:
std::cout << "Signal too weak" << std::endl;
break;
case DISTORTED:
std::cout << "Signal distorted" << std::endl;
break;
}
return 0;
}
I would certainly suggest this code as replacement here:
try
{
double d = getSample();
}
catch(std::exception const& e)
{
std::cout << "failed to read sample: " << e.what() << std::endl;
}
Assuming that the example usage is just not representative for what you
are actually doing, there is another version of writing what you do there:
typedef boost::variant<double, Signal> SignalDouble;
The point is that reading a sample either returns a value, or it returns
an errorcode explaining why there was no value. It does so using a
well-known mechanism (are variants in C++11, btw?), which makes code
clearer and more maintainable.
This assumes that there are in most cases no separate code paths for the
case that a sample was read and the one for a missing sample though. If
that is not the case, like in your example code, then using exceptions
would probably be clearer.
Happy hacking!
Uli
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]