Re: Conditional Inheritance
Thanks. Now I realise that D is much less intuitive than C++.
Re: Conditional Inheritance
I assume that you template ends up creating a dummy interface though and this isn't really acceptable. Yes, it does. Once ':' is typed, some inheritance must occur. Why isn't a dummy interface acceptable?
Re: Conditional Inheritance
On 2013-07-14, 07:00, JS wrote: I need to conditionally inherit: interface A(T) : conditionallyInherit!(isBasicType!T, B); A!(double) will inherit B but A!(mytype) won't. template conditionallyInherit(bool choice, T...) { static if (choice) { alias conditionallyInherit = T; } else { import std.typetuple : TypeTuple; alias conditionallyInherit = TypeTuple!(); } } Should work. -- Simen
Re: Conditional Inheritance
On 2013-07-14, 07:40, JS wrote: On Sunday, 14 July 2013 at 05:30:57 UTC, lomereiter wrote: On Sunday, 14 July 2013 at 05:04:37 UTC, JS wrote: and while I'm at it I need to conditionally constrain types. interface A(T) where(!isBasicType!T, (T : B)); which is suppose to require T to inherit from B if T is not basic type. interface A(T) if (isBasicType!T || is(T : B)) Thanks, works. I remember seeing code like this somewhere but couldn't find any docs about it. Here. I admit there should probably be more examples, and perhaps also some info on the classes/interfaces/structs unions pages. http://dlang.org/template.html#Constraint -- Simen
Re: Conditional Inheritance
On 07/14/2013 11:37 AM, lomereiter wrote: I assume that you template ends up creating a dummy interface though and this isn't really acceptable. Yes, it does. Once ':' is typed, some inheritance must occur. Nope. template Seq(T...){ alias T Seq; } class C : Seq!(){ } Why isn't a dummy interface acceptable? It creates unnecessary bloat. template conditionallyInherit(bool inherit, T) { static if(inherit) alias T conditionallyInherit; else alias Seq!() conditionallyInherit; }
Conditional Inheritance
I need to conditionally inherit: interface A(T) : conditionallyInherit!(isBasicType!T, B); A!(double) will inherit B but A!(mytype) won't.
Re: Conditional Inheritance
and while I'm at it I need to conditionally constrain types. interface A(T) where(!isBasicType!T, (T : B)); which is suppose to require T to inherit from B if T is not basic type.
Re: Conditional Inheritance
This should work: template conditionallyInherit(bool inherit, T) { static if (inherit) alias T conditionallyInherit; else interface conditionallyInherit {} }
Re: Conditional Inheritance
On Sunday, 14 July 2013 at 05:04:37 UTC, JS wrote: and while I'm at it I need to conditionally constrain types. interface A(T) where(!isBasicType!T, (T : B)); which is suppose to require T to inherit from B if T is not basic type. interface A(T) if (isBasicType!T || is(T : B))
Re: Conditional Inheritance
On Sunday, 14 July 2013 at 05:28:08 UTC, lomereiter wrote: This should work: template conditionallyInherit(bool inherit, T) { static if (inherit) alias T conditionallyInherit; else interface conditionallyInherit {} } Thanks, I tried something similar but it didn't work right... I assume that you template ends up creating a dummy interface though and this isn't really acceptable. e.g., interface A : conditionallyInherit!(false, B) { } will cause A to inherit from conditionallyInherit?
Re: Conditional Inheritance
On Sunday, 14 July 2013 at 05:30:57 UTC, lomereiter wrote: On Sunday, 14 July 2013 at 05:04:37 UTC, JS wrote: and while I'm at it I need to conditionally constrain types. interface A(T) where(!isBasicType!T, (T : B)); which is suppose to require T to inherit from B if T is not basic type. interface A(T) if (isBasicType!T || is(T : B)) Thanks, works. I remember seeing code like this somewhere but couldn't find any docs about it.