Jump to page: 1 2
Thread overview
Conditional Inheritance
Jul 14, 2013
JS
Jul 14, 2013
JS
Jul 14, 2013
lomereiter
Jul 14, 2013
JS
Jul 14, 2013
Simen Kjaeraas
Jul 14, 2013
JS
Jul 14, 2013
lomereiter
Jul 14, 2013
JS
Jul 14, 2013
lomereiter
Jul 14, 2013
Timon Gehr
Jul 15, 2013
lomereiter
Jul 14, 2013
Simen Kjaeraas
July 14, 2013
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
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
This should work:

template conditionallyInherit(bool inherit, T) {
    static if (inherit)
        alias T conditionallyInherit;
    else
        interface conditionallyInherit {}
}
July 14, 2013
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
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
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
> 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
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
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
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.

« First   ‹ Prev
1 2