Getting the size of a type tuple
ag0aep6g
anonymous at example.com
Thu Sep 21 19:49:14 UTC 2017
On 09/21/2017 08:44 PM, David Zhang wrote:
> Given the function F, where: F(Args...)(Args args) { ... }
>
> How can I statically determine the size of the argument list in bytes?
>
> Preferably, I would like a one-liner. However, std.algorithm doesn't
> seem to support tuples, or `Args.each!(T => T.sizeof).sum` would work.
>
> For the moment, I've settled on using a helper function:
>
> size_t size(Args...)()
> {
> size_t size;
> foreach(Arg; Args)
> size += Arg.sizeof;
> return size;
> }
>
> But it's a bit clunky. Is there a more idiomatic way to do this?
I don't have a one-liner, but here are some other solutions that might
be interesting. None of them is particularly pretty, though.
1) Recursive template:
----
template size_recur(Types ...)
{
static if (Types.length == 0) enum size_recur = 0;
else enum size_recur = Types[0].sizeof + size_recur!(Types[1 .. $]);
}
----
2) Using the std library:
----
template size_std(Types ...)
{
import std.algorithm: sum;
import std.range: only;
import std.meta: staticMap;
enum sizeOf(T) = T.sizeof;
enum size_std = staticMap!(sizeOf, Types).only.sum;
}
----
3) Declaring a packed struct in a function literal that gets immediately
called:
----
enum size_so_very_clever(Types ...) = () {
struct S { align(1) Types fields; }
return S.sizeof;
} ();
----
More information about the Digitalmars-d-learn
mailing list