D2: how to cast away const/invariant in template?

Max Samukha samukha at voliacable.com.removethis
Mon Sep 29 23:49:26 PDT 2008


On Mon, 29 Sep 2008 19:38:42 +0000 (UTC), Brian Price
<blprice61 at yahoo.com> wrote:

>Using D2: given a template with parameter T, how do you strip away
>const/invariant from the type T in an overload without creating a separate
>overload for each and every possible type?
>
>What I'm looking for is something like:
>
>T strip( T )( T arg )
>{
>    return arg;
>}
>
>T strip( T: const T )( const T arg )
>{
>    return cast(T) arg;
>}
>
>T strip( T: invariant T )( invariant T arg )
>{
>    return cast(T) arg;
>}
>
>The above doesn't work but should be enough to show what I'm asking.
>Thanks,
>Brian

Your example doesn't work because of a compiler bug. You could use
std.traits.Mutable template or its implementation:

import std.traits;

auto strip(T)(T arg)
{
    return cast(Mutable!(T)) arg;
}

or

auto strip(T)(T args)
{
    static if (is(T U == const(U)) || is(T U == invariant(U)))
        return cast(U) args;
    else
        return args;
}


More information about the Digitalmars-d-learn mailing list