On Sun, 2012-11-04 at 11:02 +1100, Clinton Mead wrote: > Hi All > > This is a feature request. To explain, lets say I want to create a > TriBool type, like so: > > enum TriBool { False, True, Unknown }; > > I now want to implement operator&&. I want operator&& to short > circuit, i.e. if the first argument is False the second argument > shouldn't be evaluated. > > So I'll make operator&& take a function object for it's second > argument, like so: > > TriBool operator&& > ( > TriBool x, > const std::function<TriBool()>& y > ) > { > if (x == False) { return False; } > else > { > TriBool y_ = y(); > if (x == True) { return y_; } > else if (y_ == False) { return False; } > else { return Unknown; } > } > } > > This way if I have: > > #define DELAY(x) [&]{ return x; } > > TriBool f(); > TriBool g(); > > I can do: > > f() && DELAY(g()) > > and hence have short circuit evaluation. > > However, what I'd like to have is just "f() && g()". It would be good > to be able to give the second argument an attribute which basically > wraps any argument passed to it with "DELAY()". Is this possible, or > has it already been done? >
I think this can be done without any additional features or extensions. Have you tried 'class TriBool' with an 'explicit operator bool', instead of overloading operator && for this purpose? Cheers, Oleg