On Monday, 14 August 2017 at 15:20:28 UTC, Steven Schveighoffer wrote:
On 8/14/17 9:48 AM, Dominikus Dittes Scherkl wrote:
> uint foo(T)(Unqual!T n) // first try
> {
>     ++n; // modify should be possible
>     return 42;
> }
> Any ideas what I need to do to make this work?

This isn't exactly supported. Implicit Function Template Instantiation (IFTI) will deduce the parameters to be the types that you pass in. You can't deduce them and then change the parameter types. This is a limitation of IFTI that I have struggled with in the past.
A little unfortunate, because I would consider this the standard usecase.
You only overload functions if they do something special with
const or shared or immutable parameters, but for templates you get a different implementation for these all the time, and you didn't even have a chance to avoid that useless code-bloat? What a pitty.


What you can do, is:

auto foo(T)(T n) if (is(T == Unqual!T))
{
   // normal implementation
}

auto foo(T)(T n) if (!is(T == Unqual!T) && isImplicitlyConvertible!(T, Unqual!T))
{
   return foo!(Unqual!T)(n);
}

Ok, I'll try that out.

Reply via email to