Re: We do not use C++ exceptions
David Abrahams wrote:
I'm not excusing liberal signed/unsigned inter-conversions. We have to
live with those. What we don't have to live with is complicated checks
inside functions for conditions that are preventable at the function
interface boundary.
Yah, that I agree with. In my experience you can weed out one half of
the check. Consider:
template <class T> struct Vector
{
...
T & operator[](int n) { enforce(n >= 0 && n < length_); ... }
}
versus:
template <class T> struct Vector
{
...
T & operator[](size_t n) { enforce(n < length_); ... }
}
If I use unsigned, I get rid of one of the tests. I don't think it's a
huge deal, but it does feel cleaner. Besides, I can use a vector > 2GB
in size on a 32-bit system, at least in theory. The underlying
assumption is that there is no combination of a vector > 2GB and a large
negative integer at the same time, which is reasonable.
However, I get nervous when I got rid of *all* tests when an unsigned
comes around. Then something is bound to run amok somewhere.
double pow(double base, unsigned exponent)
{
// look, ma! No checks!
double result = 1;
while (exponent)
{
if (exponent & 1)
{
result *= base;
--exponent;
}
else
{
result *= result;
exponent /= 2;
}
}
return result;
}
Well this function is rather prone to returning zero or infinity for
negative small exponents, which are frequent in a program and accepted
no problem. Do I still define it that way? Yes :o). I'm just more
miserable over it than others.
Andrei
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]