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, BrianYour 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