static try catch construct would be helpful

Bill Baxter dnewsgroup at billbaxter.com
Mon Feb 25 21:57:12 PST 2008


Robert Fraser wrote:
> Bill Baxter wrote:
>> When plugging types together sometimes you find this one is missing a 
>> member or that one defines it in a different way than you expect or 
>> maybe a function with some signature isn't supported.
>>
>> What you'd like to do is say "compile this block if you can -- 
>> otherwise leave it out"  It's like try-catch, but compile-time.
>> Except you don't really want a 'catch'.  It's more like an 'else'.  So 
>> I propose a new form of static:
>>
>>    static if {
>>       // some code
>>    } else static if {
>>       // other code
>>    } else {
>>       // last resort code
>>    }
>>
>> The idea is: if "some code" compiles, then use that, otherwise try 
>> "other code", and finally if none of the other code blocks compiles, 
>> use the else block.
>>
>> And of course it could be mix-n-matched with regular static if()'s.
>>
>>
>> ------
>> Here's a motivating example taken from real code where I was wrapping 
>> one struct with another.  The Inner type may or may not support a 
>> particular signature of the "doSomething" function.
>>
>> struct Outer(Inner)
>> {
>>    void doSomething(int a, int b, int c, int d)
>>    {
>>       _inner.doSomething(a,b,c,d);
>>       // do something else here
>>    }
>>
>>     ...
>>
>>    Inner _inner;
>> }
>>
>> Currently, the best way I've found to conditionalize that is:
>>
>>    static if(is(typeof(_inner.doSomething(1,1,1,1)))) {
>>    void doSomething(int a, int b, int c, int d)
>>    {
>>       _inner.doSomething(a,b,c,d);
>>       // do something else here
>>    }
>>    }
>>
>> Maybe there's a better way to write that one.. I'm not sure.  But the 
>> signature of the thing that may or may not exist can be arbitrarily 
>> complex.  It becomes difficult to think of an is-expression that can 
>> test for what you want.   You can probably break out the test into a 
>> separate template and make it so you can do
>>     static if(is(DoSomeCheck!(....))
>> but writing that DoSomeCheck is annoying too and starts to clutter 
>> your source with lots of one-off gobbledy gook templates.
>>
>> I think "argument-less static if blocks" would handle such cases nicely.
>>
>>
>> There's a slight issue in that it could be pretty hard to debug with 
>> compiler errors being silently ignored, but that happens currently 
>> with the expressions inside "static if(is(...))" already.
>>
>> --bb
> 
> I like it, although I'm not sure how difficult that'd be to implement in 
> the DMDFE's current model. votes++, under the stipulation that all code 
> in question must be syntactically correct, even if it's not semantically 
> correct. Personally, I like "static try { } else static try { } else { 
> }", which I think conveys the meaning better than static if. Also, I 
> think there should definitely be a strong caution on the specs page that 
> other methods should be tried first, since, as you mentioned, it can 
> spuriously compile the wrong thing if you accidentally have an error there.

And those could be combined with static ifs, too right?

    static try { ... } else static if (is(T==blah)) { ... } else static 
try { ... }.

--bb



More information about the Digitalmars-d mailing list