May 23, 2020
I'm currently working on a RFC for the Rust programming language, to add variadic templates to the language. This is a poorly-understood topic, and previous proposals on the subject have been ad-hock, and lacked research work to justify why their preferred implementation was best.

I think the D community would be a good source of research, both because the language has powerful templates, and because variadics and static foreach have been around long enough to be "field-tested", which hopefully means people who used them will have a good understanding of the trade-offs of their design from a practical perspective, not just an academic one. Hence my question:

Could you give me examples of the most popular/polished/powerful libraries using variadic templates?

Github links pointing to specific areas of code would be best. Essentially, I'm looking for practical examples of real code using this feature, with a focus on the following questions:

- What are practical use cases where variadics are needed?

- What are some non-trivial use cases of variadics? A trivial use case would be "print takes a list of argument and prints each argument one by one". A non-trivial use case would be "turn a tuple of arrays into an array of tuples".

- How good are the compile errors? How often do you get an error which requires reading the internal code of template functions to understand what went wrong?

- What are some guidelines to respect when writing variadic functions and foreach code?

- Are there corner cases? Problems which often trip up first-time users of variadics, design problems that you'd think would be easy to implement but turn out to bump into the limitations of D's variadics implementation?

The reason I ask these questions is because Rust has a fairly different approach from D with regards to templates; in particular, it tries to have no "monomorphization errors", errors which are invisible when writing your template function, but appear when you call that function from somewhere else.

Obviously, avoiding monomorphization errors is a lot trickier with variadics, so I'd like help identifying the corner cases, with real-world examples of D code to analyze.