www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Conditional Inheritance

reply "JS" <js.mdnq gmail.com> writes:
I need to conditionally inherit:

interface A(T) : conditionallyInherit!(isBasicType!T, B);

A!(double) will inherit B but A!(mytype) won't.
Jul 13 2013
next sibling parent reply "JS" <js.mdnq gmail.com> writes:
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.
Jul 13 2013
parent reply "lomereiter" <lomereiter gmail.com> writes:
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))
Jul 13 2013
parent reply "JS" <js.mdnq gmail.com> writes:
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.
Jul 13 2013
parent reply "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
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
Jul 14 2013
parent "JS" <js.mdnq gmail.com> writes:
On Sunday, 14 July 2013 at 09:52:29 UTC, Simen Kjaeraas wrote:
 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
thanks.
Jul 14 2013
prev sibling next sibling parent reply "lomereiter" <lomereiter gmail.com> writes:
This should work:

template conditionallyInherit(bool inherit, T) {
     static if (inherit)
         alias T conditionallyInherit;
     else
         interface conditionallyInherit {}
}
Jul 13 2013
parent reply "JS" <js.mdnq gmail.com> writes:
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?
Jul 13 2013
parent reply "lomereiter" <lomereiter gmail.com> writes:
 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?
Jul 14 2013
parent reply Timon Gehr <timon.gehr gmx.ch> writes:
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; }
Jul 14 2013
parent "lomereiter" <lomereiter gmail.com> writes:
Thanks.
Now I realise that D is much less intuitive than C++.
Jul 14 2013
prev sibling parent "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
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
Jul 14 2013