The struct hack where you have an array of length 0 as the last member of a struct from C90 and C99 is well known, and with the introduction of flexible array members in C99
This is C++, so templates are available:
template struct hack { int filler; int thing [N]; };
Casting between different pointers to different instantiations will be the difficult issue, then.