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