Overlapping functionality: IFTI, templates, is-expressions

Jason House jason.james.house at gmail.com
Wed Mar 19 19:25:27 PDT 2008


Russell Lewis wrote:

> Jason House wrote:
>> #2 I know from past discussions that C++ programmers hold this very near
>> #and
>> dear to their heart.  Personally, it seems like a back door to long
>> compilation times.  I don't have any problem with enforcing criteria for
>> templates to be defined up front, but I'm certain others don't agree with
>> me.  Does the loss of SFINAE make templates too close to generics?  I
>> know C# will refuse to compile code if the up-front criteria for a
>> generic type isn't specific enough.
> 
> (quoting the Joker) "I have a name for my pain, and it is SFINAE!"
> 
> Now I understand why dmd works (or actually, fails to work) the way it
> does.  When I have some deeply-nested set of templates, and there is
> some quirkly little problem deep within them, then dmd will often give
> me some totally useless error:
> foo.d: 25: template "wrapper_way_on_the_outside" has an error
> 
> GRRRR!!!!  I thought that this was a bug in the compiler...
> 
> The only way to debug these problems is to unwrap the template, by hand,
> using repeated aliases over and over and over, dozens of compiles, until
> you finally find the problem.  It's usually that some minor template way
> off in the bowels of my library wasn't properly overloaded for some
> specific case.
> 
> void myFunctionThatWillNotCompile()
> {
> alias deepestNestedTemplate!(ARGS) a1;
> alias nextLevel!(deepestNestedTemplate!(ARGS)) a2;
> alias adNauseum!(...) a3;
> /+
> ... this code commented out because SFINAE makes
> ... dmd produce error messages that don't tell me
> ... what I need to know
> +/
> }
> 
> Worse, it means that if I have a properly-specialized template for some
> case, but the implementation within it has a small error, my code is
> going to get routed to the general, catch-all template (which it never
> should have hit), and the errors that I actually *do* see won't make any
> sense.
> 
> EEEK!!!
> 
> I know that there must be a reason why people argue for SFINAE, but,
> from my recent experience, I have to disagree.  I will say (with all
> modestly and readiness to learn otherwise) that "SFINAE IS EVIL."
> 
> Here's my modest proposal:
> * If there is a "best match," force the code to use it.  Don't ignore
> the best match because of internal compilation errors.
> * If people really need SFINAE, then give them a way to express it
> explicitly.  Something like:
> template foo(int n)
> {
> static if(n == 0)
> try_next_best_specialization;
> }


Making it explicit was discussed on the mailing list in the past (a few
months ago?).  IIRC, nothing came of it.  



More information about the Digitalmars-d mailing list