On 6 July 2013 11:42, finalpatch <fengli@gmail.com> wrote:
On Saturday, 6 July 2013 at 01:35:09 UTC, Manu wrote:
Okay, so I feel like this should be possible, but I can't make it work...
I want to use template deduction to deduce the argument type, but I want
the function arg to be Unqual!T of the deduced type, rather than the
verbatim type of the argument given.

I've tried: void f(T : Unqual!U, U)(T a) {}
and: void f(T)(Unqual!T a) {}

Ie, if called with:
  const int x;
  f(x);
Then f() should be generated void f(int) rather than void f(const int).

I don't want a million permutations of the template function for each
combination of const/immutabe/shared/etc, which especially blows out when
the function has 2 or more args.

Note: T may only be a primitive type. Obviously const(int*) can never be
passed to int*.

this?

template f(T)
{
    void f (T x)
    {
        f_i(x);
    }
    void f_i(Unqual!T x)
    {
        writefln("%s", x);
    }
}

And again, f(T), the signature is wrong. There is also an additional call... twice as slow when non-optimised :/