Thread overview | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
July 14, 2013 Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
I need to conditionally inherit: interface A(T) : conditionallyInherit!(isBasicType!T, B); A!(double) will inherit B but A!(mytype) won't. |
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to JS | 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. |
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to JS | This should work: template conditionallyInherit(bool inherit, T) { static if (inherit) alias T conditionallyInherit; else interface conditionallyInherit {} } |
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to JS | 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))
|
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to lomereiter | 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?
|
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to lomereiter | 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.
|
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to JS | > 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?
|
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to JS | 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 |
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to JS | 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 |
July 14, 2013 Re: Conditional Inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to Simen Kjaeraas | 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.
|
Copyright © 1999-2021 by the D Language Foundation