www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - D2: how to cast away const/invariant in template?

reply Brian Price <blprice61 yahoo.com> writes:
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
Sep 29 2008
parent reply Max Samukha <samukha voliacable.com.removethis> writes:
On Mon, 29 Sep 2008 19:38:42 +0000 (UTC), Brian Price
<blprice61 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; }
Sep 29 2008
parent reply Max Samukha <samukha voliacable.com.removethis> writes:
On Tue, 30 Sep 2008 09:49:26 +0300, Max Samukha
<samukha voliacable.com.removethis> wrote:

On Mon, 29 Sep 2008 19:38:42 +0000 (UTC), Brian Price
<blprice61 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
auto strip(T)(T args)
{
    static if (is(T U == const(U)) || is(T U == invariant(U)))
        return cast(U) args;
    else
        return args;
}
args was meant to be arg
Sep 29 2008
parent Brian Price <blprice61 yahoo.com> writes:
The std.traits.Mutable solution is exactly what I needed.
Thanks,
Brian
Sep 30 2008