digitalmars.D.learn - Creating a template mixin for explicit casts.
- Sjoerd Nijboer (31/31) May 17 2018 Given the following code
- Paul Backus (3/8) May 17 2018 It sounds like you want to overload opCast:
- Sjoerd Nijboer (23/31) May 17 2018 Something like:
- Sjoerd Nijboer (4/6) May 17 2018 I guess I can refine my question to "How do you let a mixin
- Meta (4/35) May 17 2018 Before you write anything yourself, check whether
Given the following code `struct Foo(T) if(isNumeric!T) { T t; .. other code } struct Bar(T) if(isNumeric!T) { T t; .. other code } Foo!float foo_float; Foo!double foo_double; Bar!float bar_float; ` I want to make a template mixin that is able to cast one of these generic structs to the other explicitly. I have a bunch of these structs and therefore I thought it would make sense to do it by template mixin. I just don't know what language or library features I need to use and how to apply them. ` fooDouble = cast (Foo!double) foo_float; // case [1] if possible, done by // an implicit cast. Else by //explicit. fooFloat = cast (Foo!float) foo_double; // case [2] barFloat = cast (Bar!float) foo_float; // case [3] ` How would I do this in D?
May 17 2018
On Thursday, 17 May 2018 at 15:25:37 UTC, Sjoerd Nijboer wrote:I want to make a template mixin that is able to cast one of these generic structs to the other explicitly. I have a bunch of these structs and therefore I thought it would make sense to do it by template mixin. I just don't know what language or library features I need to use and how to apply them.It sounds like you want to overload opCast: https://dlang.org/spec/operatoroverloading.html#cast
May 17 2018
On Thursday, 17 May 2018 at 16:27:48 UTC, Paul Backus wrote:On Thursday, 17 May 2018 at 15:25:37 UTC, Sjoerd Nijboer wrote:Something like: ` Foo!T opCast(U)(Foo!U old) if (isImplicitlyConvertible!(T, U)) { return Foo!T(old.t); } Foo!T opCast(UTemplate, U)(UTemplate!U old) if (isImplicitlyConvertible!(T, U) && isNumerical!U) { return Foo!T(old.t); } ` But then how do you put this into a mixin template so I can write something like ` struct Foo(T) if(isNumerical(T)) { mixin castingRules(typeof(this) T); } `I want to make a template mixin that is able to cast one of these generic structs to the other explicitly. I have a bunch of these structs and therefore I thought it would make sense to do it by template mixin. I just don't know what language or library features I need to use and how to apply them.It sounds like you want to overload opCast: https://dlang.org/spec/operatoroverloading.html#cast
May 17 2018
On Thursday, 17 May 2018 at 20:38:13 UTC, Sjoerd Nijboer wrote:But then how do you put this into a mixin template so I can ... mixin castingRules(typeof(this) T);I guess I can refine my question to "How do you let a mixin template detect the template name it is instantiated with and return its type whitout the template arguments.
May 17 2018
On Thursday, 17 May 2018 at 15:25:37 UTC, Sjoerd Nijboer wrote:Given the following code `struct Foo(T) if(isNumeric!T) { T t; .. other code } struct Bar(T) if(isNumeric!T) { T t; .. other code } Foo!float foo_float; Foo!double foo_double; Bar!float bar_float; ` I want to make a template mixin that is able to cast one of these generic structs to the other explicitly. I have a bunch of these structs and therefore I thought it would make sense to do it by template mixin. I just don't know what language or library features I need to use and how to apply them. ` fooDouble = cast (Foo!double) foo_float; // case [1] if possible, done by // an implicit cast. Else by //explicit. fooFloat = cast (Foo!float) foo_double; // case [2] barFloat = cast (Bar!float) foo_float; // case [3] ` How would I do this in D?Before you write anything yourself, check whether std.conv.castFrom does what you need: https://dlang.org/phobos/std_conv.html#castFrom
May 17 2018