On Thu, 27 Sep 2012 11:46:05 -0400, Namespace <rswhi...@googlemail.com> wrote:

On Thursday, 27 September 2012 at 15:39:39 UTC, Steven Schveighoffer wrote:
On Thu, 27 Sep 2012 11:34:15 -0400, Namespace <rswhi...@googlemail.com> wrote:

Ok. And there is no performance difference? Just for the sake of completeness. :)

performance where?  Template instantiation is done at compile time.

The resulting code should be unaffected runtime-performance wise.

-Steve

I mean: is there any difference by building the template? I don't understand what "more flexible" exactly mean.

The constraint basically is saying whether to instantiate the template or not, it has little to do with runtime performance.

Flexible means you have a full boolean logic you can use.

For example, if you had two unrelated objects A and B, how would you instantiate a template if the parameter derives from A *or* derives from B?

With a template constraint, that's:

template tmp(T) if(is(T : A) || is(T : B))

This is impossible to do with a specialization.

However, there are some limitations. Template constraints don't cascade, while specializations do.

So while this:

template tmp(T) ...
template tmp(T : A)

works fine, this:

template tmp(T) ...
template tmp(T) if (is(T : A)) ...

does not, because it can instantiate both with an A. Instead you have to do:

template tmp(T) if(!is(T : A)) ...
template tmp(T) if(is(T : A)) ...

It has been proposed to try and use else (if), but Walter didn't like it.

-Steve

Reply via email to