Reputation: 6441
I want to define a number of structs, each starting with the same member:
struct A {
S s; // same member
X x; // other members
}
struct B {
S s; // same member
Y y; // other members
}
What is a mixin template to achieve this?
Upvotes: 4
Views: 188
Reputation: 798
A slightly different take on David's answer:
//The actual building of the struct
mixin template PrefilledImpl(string name, string common, string individual)
{
mixin("struct " ~ name ~ "{" ~ common ~ individual ~ "}");
}
//A sort of template currying
mixin template Prefilled(string templateName, string common)
{
mixin("mixin template " ~ templateName ~
"(string name, string individual) {mixin PrefilledImpl!(name, \""
~ common ~ "\", individual);}");
}
//declare the "prototype" for the struct
mixin Prefilled!("StructWithInt", q{int a;});
//declare the actual struct type
mixin StructWithInt!("MyStructA", q{double b;});
//and again for a different struct
mixin Prefilled!("StructWithLots", q{float z; char[][] ns; ulong id;});
mixin StructWithLots!("MyStructB", q{void* data;});
void main()
{
MyStructA foo;
foo.a = 2;
foo.b = 4.65;
MyStructB bar;
bar.z = 3.2;
//etc.....
}
FYI the q{} syntax is optional, you can just pass normal strings instead.
Upvotes: 0
Reputation: 6055
import std.array;
struct S {}
struct X {}
struct Y {}
mixin template Common() {
S s; // same member
}
string struct_factory(string name, string[] args...) {
return `struct ` ~ name ~ ` {
mixin Common;
` ~ args.join("\n") ~ `
}`;
}
mixin(struct_factory("A", "X x;"));
mixin(struct_factory("B", "Y y;"));
void main() {
A a;
B b;
}
Or (hide the string-mixin):
import std.array;
struct S {}
struct X {}
struct Y {}
private string struct_factory(string name, string[] args...) {
return `struct ` ~ name ~ ` {
mixin Common;
` ~ args.join("\n") ~ `
}`;
}
mixin template Common() {
S s;
}
mixin template Struct(string name, Args...) {
mixin(struct_factory(name, [Args]));
}
mixin Struct!("A", "X x;");
mixin Struct!("B", "Y y;");
void main() {
A a;
B b;
}
Upvotes: 3
Reputation: 2991
mixin template Common() {
S s; // same member
}
struct A {
mixin Common;
X x;
}
struct B {
mixin Common;
Y y;
}
See Template Mixin
Upvotes: 5