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.