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*.

You could just forward to an implementation template, passing explicitly the arguments. This is kind of like the "take" function making an explicit call to "Take!T" I guess. In any case, this is what I mean.

--------
void foo(T)(T t)
{
    fooImpl!(Unqual!T)(t);
}
void fooImpl(T)(T t)
{
    static assert(is(Unqual!T == T));
    //do it
}

void main()
{
    const(int) x;
    foo(x);
}
--------

This should do what you want. foo should be completly inlined away I believe. It is a tiny bit hackish, but should work. You'll generate all flavors of foo, but only Unqual'd versions of fooImpl (which is what you care about). You can also add some "isPrimitivee!T" if you want or something.

Not sure how this deals with "shared" ? In any case, you asked for "Unqual", so that's what you get ;)

Reply via email to