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.

Reply via email to