Collaborative Container
Salih Dincer
salihdb at hotmail.com
Tue Feb 28 18:20:43 UTC 2023
Greetings to everyone who has fallen in love with D... 😀
I have a collaborative container (Node) and another convenience
struct (S) where they work together. Node can be a struct or
class, so a 3rd type is not allowed.
This is easy to do, `static if(is...` came to our rescue. But
because the compiler interprets the alias first for some reason,
we get this error message:
> source_file.d(13): Error: no property `CLL` for type `TestBP`
> source_file.d(55): Error: template instance `source.S!(TestBP)`
> error instantiating
I implemented the solution using the mixin template and dividing
S into 2 parts. Moreover, I got rid of the `static assert`:
```d
struct S(Node)
{
static if(is(Node == struct))
{
private Node * data;
}
else static if(is(Node == class))
{
private Node data;
}
else static assert(0, "\nIt's not a container!");
alias T = typeof(Node.CLL);
this(T value) { data = new Node(value); }
}
struct S_part1(Node)
if(is(Node == struct) || is(Node == class))
{
mixin S_part2!Node;
this(T value) { data = new Node(value); }
}
template S_part2(Node)
{
static if(is(Node == struct))
{
private Node * data;
}
else static if(is(Node == class))
{
private Node data;
}
alias T = typeof(Node.CLL);
}
class Bar {
int data;
alias CLL = data;
this(int i) { data = i; }
}
struct Foo {
int data;
alias CLL = data;
this(int i) { data = i; }
}
void main()
{
// By-Pass Test:
enum TestBP { None }
S!TestBP test1;
// Test okay:
enum TestOK { CLL }
S!TestOK test2;
// New solution:
S_part1!Foo foo;
S_part1!Bar bar;
}
```
SDB at 79
More information about the Digitalmars-d
mailing list