template staticPaddedStruct(S)
static foreach (member; __traits(derivedMembers, S))
import std.traits : hasUDA, getUDAs;
mixin("typeof(S." ~ member ~ ")" ~ member ~ ";");
static if (hasUDA!(__traits(getMember, S, member), Padding))
enum __PADDING_SIZE__ = getUDAs!(__traits(getMember, S, member), Padding)[0].padding;
mixin("ubyte[" ~ to!string(__PADDING_SIZE__) ~ "] __PADDING__" ~ member ~ ";");
alias staticPaddedStruct = inner;
template staticSizedStruct(S, size_t size)
alias padded = staticPaddedStruct!S;
pragma(msg, padded.sizeof);
static foreach (member; __traits(derivedMembers, padded))
mixin("typeof(padded." ~ member ~ ")" ~ member ~ ";");
static if (padded.sizeof < size)
mixin("ubyte[" ~ to!string(size - padded.sizeof) ~ "] __PADDING__;");
pragma(msg, inner.sizeof);
alias staticSizedStruct = inner;
alias Foo = staticSizedStruct!(FooImpl, 12);
assert(Foo.sizeof == 12);
assert(FooImpl.sizeof == 8);