Mixin Template for Defining Structures with the Same Member

I want to define several structures, each of which begins with the same element:

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 for this?

+4
source share
3 answers
 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 mixin string):

 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; } 
+3
source
 mixin template Common() { S s; // same member } struct A { mixin Common; X x; } struct B { mixin Common; Y y; } 

See Template Mixin

+5
source

A slightly different opinion of David:

 //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 q {} syntax is optional, you can just pass regular strings.

0
source

Source: https://habr.com/ru/post/1488300/


All Articles