| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
November 20, 2013 Class Array in D? | ||||
|---|---|---|---|---|
| ||||
is there a way I can pass a TypeTulip to a function?
Something like:
Can I create a class array in D? Something like:
interface A {}
class AA: A {}
class AB: A {}
class AC: A {}
ClassList!A list = new ClassList!A {AA, AB, AC};
void testf(ulong testv) {
A a = new list[testv];
}
I know about TypeTuple but that doesn't allow setting a requirement does it?
| ||||
November 20, 2013 Re: Class Array in D? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jeroen Bollen | On 11/20/2013 10:12 AM, Jeroen Bollen wrote:
> is there a way I can pass a TypeTulip to a function?
alias TypeTulip = TypeTuple;
;)
> Something like:
>
> Can I create a class array in D? Something like:
>
> interface A {}
> class AA: A {}
> class AB: A {}
> class AC: A {}
>
> ClassList!A list = new ClassList!A {AA, AB, AC};
>
> void testf(ulong testv) {
> A a = new list[testv];
> }
>
> I know about TypeTuple but that doesn't allow setting a requirement does
> it?
import std.stdio;
import std.typetuple;
interface A {}
class AA: A {}
class AB: A {}
class AC: A {}
alias TypeTulip = TypeTuple;
alias list = TypeTuple!(AA, AB, AC);
void testf(ulong testv) {
// NOTE: This is a compile-time foreach
foreach (i, Type; list) {
if (i == testv) {
A a = new Type();
writefln("I made it: %s", a);
}
}
}
void main()
{
testf(1);
}
Note that the foreach loop above is not a loop that gets executed at run time. Its body is expanded inline as code multiple times as needed. I try to explain this a little under the "Compile-time foreach" and "foreach with TypeTuple" sections here:
http://ddili.org/ders/d.en/tuples.html
Ali
| |||
November 20, 2013 Re: Class Array in D? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Wednesday, 20 November 2013 at 18:23:37 UTC, Ali Çehreli wrote:
> On 11/20/2013 10:12 AM, Jeroen Bollen wrote:
>
> > is there a way I can pass a TypeTulip to a function?
>
> alias TypeTulip = TypeTuple;
>
> ;)
>
> > Something like:
> >
> > Can I create a class array in D? Something like:
> >
> > interface A {}
> > class AA: A {}
> > class AB: A {}
> > class AC: A {}
> >
> > ClassList!A list = new ClassList!A {AA, AB, AC};
> >
> > void testf(ulong testv) {
> > A a = new list[testv];
> > }
> >
> > I know about TypeTuple but that doesn't allow setting a
> requirement does
> > it?
>
> import std.stdio;
> import std.typetuple;
>
> interface A {}
> class AA: A {}
> class AB: A {}
> class AC: A {}
>
> alias TypeTulip = TypeTuple;
> alias list = TypeTuple!(AA, AB, AC);
>
> void testf(ulong testv) {
> // NOTE: This is a compile-time foreach
> foreach (i, Type; list) {
> if (i == testv) {
> A a = new Type();
> writefln("I made it: %s", a);
> }
> }
> }
>
> void main()
> {
> testf(1);
> }
>
> Note that the foreach loop above is not a loop that gets executed at run time. Its body is expanded inline as code multiple times as needed. I try to explain this a little under the "Compile-time foreach" and "foreach with TypeTuple" sections here:
>
> http://ddili.org/ders/d.en/tuples.html
>
> Ali
That doesn't allow specifying a base class all members should be a part of though, or does it?
| |||
November 20, 2013 Re: Class Array in D? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jeroen Bollen | On Wednesday, 20 November 2013 at 18:31:37 UTC, Jeroen Bollen wrote:
> That doesn't allow specifying a base class all members should be a part of though, or does it?
You could write your own tuple template for it, or just let the compile fail on the factory function: the A a = new T(); will fail if A isn't a base class or interface of T.
Putting the check in the list could look like this:
bool checkClassList(Base, T...)() {
foreach(t; T) {
static if(!is(t : Base))
static assert(0, t.stringof ~ " is not a child of " ~ Base.stringof);
}
return true;
}
template ClassList(Base, T...) if(checkClassList!(Base, T)) {
alias ClassList = T;
}
Usage:
alias list = ClassList!(A, AA, AB, AC); // good
add:
class B {}
alias list = ClassList!(A, AA, AB, AC, B);
and get error:
test50.d(12): Error: static assert "B is not a child of A"
test50.d(19): instantiated from here: checkClassList!(A, AA, AB, AC, B)
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply