How to specify a template that uses unqualified type, like any normal function
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Aug 14 15:38:19 PDT 2017
On 08/15/2017 12:14 AM, Dominikus Dittes Scherkl wrote:
> T foo(T)(T n)
> {
> static if(!is(Unqual!T == T)) return foo!(Unqual!T)(n);
> else
> {
> // normal implementation
> }
> }
>
> So it's basically 2 lines of overhead. That's acceptable. The check for
> isImplicitlyConvertible is not necessary, because if it's not it will
> error out anyway.
I'm probably missing something, but copying the parameter to a local
variable seems simpler than doing it with overloads:
----
T foo(T)(T n)
{
Unqual!T m = n;
++m;
return m;
}
----
> As this in fact leads to some decrease in code size (as the instances
> for const or shared parameters are now much smaller or in fact
> completely removed by the inliner, much less template code duplication
> happens), I will add this to a lot of templates - seems this will become
> some sort of standard D boilerplate code.
Regarding shared, be aware that dmd lets you copy a value type from
shared to unshared, but it doesn't emit an atomic load for the copy. So
it's generally not thread-safe to do it.
More information about the Digitalmars-d-learn
mailing list