digitalmars.D.learn - D2: how to cast away const/invariant in template?
- Brian Price (19/19) Sep 29 2008 Using D2: given a template with parameter T, how do you strip away
- Max Samukha (17/36) Sep 29 2008 Your example doesn't work because of a compiler bug. You could use
- Max Samukha (3/36) Sep 29 2008 args was meant to be arg
- Brian Price (3/3) Sep 30 2008 The std.traits.Mutable solution is exactly what I needed.
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
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
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, Brianauto 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
The std.traits.Mutable solution is exactly what I needed. Thanks, Brian
Sep 30 2008








Brian Price <blprice61 yahoo.com>