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

Reply via email to