"SFINAE is Evil"

Jason House jason.james.house at gmail.com
Sat Mar 22 07:39:10 PDT 2008


Ok, so you're saying you could do without SFINAE?

Christopher Wright Wrote:

> Jason House wrote:
> > I should probably expand this question...
> > 
> > Who uses templates in D? What is the most complex use you've done? Do you ever plan to get more complex? Would SFINAE make your life easier or harder?
> 
> Templates are utterly necessary and horribly untestable. I use them, but 
> I try to keep them as braindead simple as possible.
> 
> I've done a reasonable amount of work with simple templates, eg DUnit's 
> assertions, and some slightly more complex stuff, as with DMocks, but 
> nothing incredibly difficult.
> 
> DMocks was mainly a matter of looping through reflection information and 
> assembling some strings based on that, which wasn't so difficult; the 
> hardest thing (besides debugging CTFE failures and oddities with mixins, 
> but I did my best to limit the amount of both) was not being able to 
> have a variable whose type was an empty tuple. I had to wrap the tuple 
> in a templated class that would just not instantiate the arguments 
> variable with an empty tuple.
> 
> SFINAE isn't a problem for me -- I don't need to overload templates 
> much. If I did, I'd do it like this:
> 
> template Foo(T, U, V...)
> {
>     static if (condition1)
>     {
>        alias FooSpecialization1!(T, U, V) Foo;
>     }
>     else
>     // ...
> }
> 
> The only thing the compiler could do to help me that it isn't doing is 
> to make it an error to have overloaded templates.
> 
> > I've written templates classes that have one definition, and used static if as needed for specialization. I don't forsee more complex usage and view SFINAE as something that would mask bugs.
> 
> Same. The only issue is with templates from different modules or libraries.
> 
> In this case, it could be helpful for the compiler to have an error 
> message along the lines of:
> 
> template instantiation Foo!(int, float, float, char[]): could not 
> instantiate.
> Candidates are:
> valhalla.odin.Foo(T : long, U, T, V[char]) : char[] is not a V[char]
> valhalla.thor.Foo(T : class, U...) : int is not a class
> ...




More information about the Digitalmars-d mailing list