This is an usage example of std.typetuple.staticMap from the online docs: alias T = staticMap!(Unqual, int, const int, immutable int); static assert(is(T == TypeTuple!(int, int, int))); staticMap is similar to map, it maps a given template on a sequence of items. Using Haskell syntax (http://www.haskell.org/haskellwiki/Kind ) it has kind: staticMap :: (* -> *) -> [*] -> [*] In some cases it's also useful a related higher order TypeTuple template like this, kind of the opposite of staticMap: import std.string: leftJustify, center, rightJustify; alias U = staticApplyMap!(string, leftJustify, center, rightJustify); static assert(is(U == TypeTuple!(leftJustify!string, center!string, rightJustify!string))); With kind: staticApplyMap :: * -> [* -> *] -> [*] So the first argument of staticApplyMap is seen as an item, and the following ones as templates that accept an argument. It returns a TypeTuple of all the templates applied on the first given item.
std.typetuple doesn't exist anymore and the idea had never been expressed in a pull request.
std.typetuple was moved to std.meta, so the request is still valid. We have ApplyLeft and ApplyRight, which take a template as the first parameter, and combined with staticMap, could work as long as the parameters are reversed (the template comes last). Having something that applies a single parameter (or even multipe ones) to a list of templates would be useful as well, and is difficult to do directly. However, I don't think we need a specific function, a helper like this would work: template ApplyWith(Args...) { alias ApplyWith = ApplyLeft!(Args[$-1], Args[0 .. $-1]); } alias T = staticMap!(ApplyLeft!(ApplyWith, string), leftJustify, center, rightJustify); void main() { foreach(f; T) writeln(f("hello", 20)); } It's not perfect. The resulting T isn't a tuple of instantiated templates, it's a tuple of ApplyLeft aliases, awaiting instantiation. But a helper like the above would be useful. Is there an "Instantiate" template that could be used in place of ApplyLeft inside the ApplyWith template? That might be more proper.
(In reply to Steven Schveighoffer from comment #2) > Is there an "Instantiate" > template that could be used in place of ApplyLeft inside the ApplyWith > template? That might be more proper. There is, it's just private: https://github.com/dlang/phobos/blob/master/std/meta.d#L1670
PR: https://github.com/dlang/phobos/pull/5738
As David Nadlinger pointed out, this can already be solved with Instantiate and ApplyRight. I added a PR to make Instantiate public, and add the solution to this issue as a documented unit test. https://github.com/dlang/phobos/pull/5739
Commits pushed to master at https://github.com/dlang/phobos https://github.com/dlang/phobos/commit/f3cec8bdd38529848c5c1bed1f5a2a9817e07203 Fix issue 9591 - Allow Instantiate template to be public, give example of how Instantiate + ApplyRight can be used to solve the problem. https://github.com/dlang/phobos/commit/efae08503d9a83d6abdf29270e4c363c393e53de Merge pull request #5739 from schveiguy/fix9591 Fix issue 9591 - Allow Instantiate template to be public
Commits pushed to stable at https://github.com/dlang/phobos https://github.com/dlang/phobos/commit/f3cec8bdd38529848c5c1bed1f5a2a9817e07203 Fix issue 9591 - Allow Instantiate template to be public, give example https://github.com/dlang/phobos/commit/efae08503d9a83d6abdf29270e4c363c393e53de Merge pull request #5739 from schveiguy/fix9591