Non-recursive maxSizeOf
H. S. Teoh
hsteoh at quickfur.ath.cx
Thu Aug 6 12:51:22 UTC 2020
On Thursday, 6 August 2020 at 00:58:39 UTC, Per Nordlöw wrote:
> Is it possible to implement
>
> template maxSizeOf(T...)
> {
> static if (T.length == 1)
> enum size_t maxSizeOf = T[0].sizeof;
> else
> {
> enum size_t firstSize = T[0].sizeof;
> enum size_t maxSizeRest = maxSizeOf!(T[1 .. $]);
> enum size_t maxSizeOf = firstSize >= maxSizeRest ?
> firstSize : maxSizeRest;
> }
> }
>
> in a non-recursive way?
Of course. In fact, it's trivial:
------
template maxSizeOf(T...)
{
align(1) union Impl {
T t;
}
enum maxSizeOf = Impl.sizeof;
}
------
To check that this does what we expect:
------
pragma(msg, maxSizeOf!(char)); // 1LU
pragma(msg, maxSizeOf!(char, short, ubyte)); // 2LU
pragma(msg, maxSizeOf!(char, long, ubyte)); // 8LU
align(1) struct S {
long l;
ubyte b;
}
pragma(msg, maxSizeOf!(long, S)); // 9LU
pragma(msg, maxSizeOf!(int, ubyte[7])); // 7LU
pragma(msg, maxSizeOf!(int, ubyte[3])); // 4LU
------
Why bother with recursion and all of that fancy gobbledygook when
the compiler already knows how to compute the maximum size of
something? ;-)
More information about the Digitalmars-d-learn
mailing list