Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
January 18, 2021 How do I make a template function that only accepts instances of a specific class? | ||||
---|---|---|---|---|
| ||||
isInstanceOf from std.traits seems to not work with class the way I need to. I'd like to make a template function accepts only class of a specified class type class A { } class B : A { } class C : A { } import std.traits : isInstanceOf; int f(T)(in A[int] arr) if(isInstanceOf!(A, T)) // doesn't work for class from what I saw { foreach(c; arr) { if((cast(A)c) !is null) { } } // ... } int f(T)(in A[int] arr) if(cast(T) !is null) // run time this is ok but not at compile time { // ... } |
January 18, 2021 Re: How do I make a template function that only accepts instances of a specific class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jack | On Monday, 18 January 2021 at 18:40:37 UTC, Jack wrote:
> isInstanceOf from std.traits seems to not work with class the way I need to. I'd like to make a template function accepts only class of a specified class type
>
> class A { }
> class B : A { }
> class C : A { }
>
> int f(T)(in A[int] arr)
Use
if(is(T : A))
the syntax there is similar to the class declaration itself.
isInstanceOf is for checking instances of templates rather than classes.
|
January 18, 2021 Re: How do I make a template function that only accepts instances of a specific class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Monday, 18 January 2021 at 19:02:10 UTC, Adam D. Ruppe wrote: > On Monday, 18 January 2021 at 18:40:37 UTC, Jack wrote: >> isInstanceOf from std.traits seems to not work with class the way I need to. I'd like to make a template function accepts only class of a specified class type >> >> class A { } >> class B : A { } >> class C : A { } >> >> int f(T)(in A[int] arr) > > Use > > if(is(T : A)) > > the syntax there is similar to the class declaration itself. is that sytax derived from there? > isInstanceOf is for checking instances of templates rather than classes. I see Thanks! |
January 18, 2021 Re: How do I make a template function that only accepts instances of a specific class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jack | On Monday, 18 January 2021 at 19:34:52 UTC, Jack wrote: > is that sytax derived from there? sort of. it is the type pattern matching "is expression" described here: https://dlang.org/spec/expression.html#IsExpression The is(A:B) thing technically means "if A is implicitly convertible to B" which of course works for base classes and interfaces well but that's not all it does, like is(int : long) passes too. I just remember the syntax thanks to its similarity to type declarations. |
January 18, 2021 Re: How do I make a template function that only accepts instances of a specific class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Monday, 18 January 2021 at 19:54:04 UTC, Adam D. Ruppe wrote: > On Monday, 18 January 2021 at 19:34:52 UTC, Jack wrote: >> is that sytax derived from there? > > sort of. it is the type pattern matching "is expression" described here: > > https://dlang.org/spec/expression.html#IsExpression I read std.traits and some related stuff but missed reading is expression doc lol > > The is(A:B) thing technically means "if A is implicitly convertible to B" which of course works for base classes and interfaces well but that's not all it does, like is(int : long) passes too. C# uses something like that too but I totally missed to look for the equivalent in D, which would be pretty much same thing > I just remember the syntax thanks to its similarity to type declarations. good way to remember too |
Copyright © 1999-2021 by the D Language Foundation