If Statement with Declaration

Jerry via Digitalmars-d digitalmars-d at puremagic.com
Fri Nov 4 08:27:08 PDT 2016


On Friday, 4 November 2016 at 14:10:51 UTC, Steven Schveighoffer 
wrote:
> On 11/3/16 6:29 PM, Jerry wrote:
>>
>> So I was thinking of a way of extending if statements that have
>> declarations. The following being as example of the current 
>> use of if
>> statements with declarations:
>>
>>     if(int* weDontPollute = someFunc())
>>     {
>>          // use weDontPollute
>>     }
>>
>> That's great and all, but it only works by checking if the 
>> variable
>> evaluates to true or false. Which is fine for a pointer but 
>> otherwise
>> useless for anything else, like integers where zero is usually 
>> valid
>> input (index for array). So currently the only way to do 
>> something like
>> this in the language, that i've found, is to use a for 
>> statement.
>>
>>     for(int i = someFunc(); i >= 0;)
>>     {
>>         // use i
>>
>>         break;
>>     }
>>
>> Not that ideal to use a for statement. It makes it hard to 
>> read and if
>> the break condition isn't there it might very well be an 
>> infinite loop.
>> So I was thinking of some sort of syntax like this:
>>
>>     if(int i = someFunc(); i >= 0)
>>     {
>>         // use i
>>     }
>> Thoughts on this sort of feature?
>
>
> Hm... what about something like:
>
> struct BoolCond(T, string cond)
> {
>    T val;
>    bool opCast(B)() if(is(B == bool))
>    {
>      return mixin("val " ~ cond);
>    }
> }
>
> auto boolcond(string cond, T)(T val)
> {
>    return BoolCond!(T, cond)(val);
> }
>
> if(auto i = someFunc.boolcond!(">= 0"))
> {
>    ... // use i
> }
>
> -Steve

Well that's just a basic case, what if you want more than one 
condition. Using "&&" for example, or a condition along with 
another value that's in the scope.

void otherFunc(int input)
{
     if(auto i = someFunc.boolcond!(">= input")) // --- error
     {
        ... // use i
     }
}

Then you need another work around for something like this:

if(int value; auto i = someFunc(&value))
{
    // ...
}




More information about the Digitalmars-d mailing list