staticMap but with two arguments
Ali Çehreli
acehreli at yahoo.com
Mon Feb 6 09:17:07 UTC 2023
On 2/5/23 17:20, John Chapman wrote:
> staticMap's "fun" can only be
> instantiated with a single argument, while I need it to work with two.
I adapted staticMap's implementation to two sets of arguments:
import std.meta : AliasSeq;
// The first half of 'args' is the "first arguments" and
// the second half is the "second arguments".
//
// (This can be generalized to N sets of arguments.)
template staticMap2(alias fun, args...)
{
alias firsts = args[0 .. $ / 2];
alias seconds = args[$ / 2 .. $];
static assert(firsts.length == seconds.length,
"Mismatched number of first and second arguments");
alias staticMap2 = AliasSeq!();
static foreach (i; 0 .. firsts.length) {
staticMap2 = AliasSeq!(staticMap2, fun!(firsts[i], seconds[i]));
}
}
// An example struct with two template parameters
struct S(T, size_t length) {
}
// An example template that creates instantiations of the S template
// (This can be generalized to instantiation of any template.)
template Instantiate(T, size_t length) {
alias Instantiate = S!(T, length);
}
// An example use
alias myTypes = AliasSeq!(int, double, long);
alias mySizes = AliasSeq!(1, 2, 3);
alias result = staticMap2!(Instantiate, myTypes, mySizes);
pragma(msg, result);
void main() {
}
Ali
More information about the Digitalmars-d-learn
mailing list