是否有任何内置或库提供的方法在D中映射一组可变参数模板参数?
例如:
void foo(Args...)(Args args)
{
bar(fun(args));
}
我希望将其扩展为:
void foo(Args...)(Args args)
{
bar(fun(args[0]), fun(args[1]), fun(args[2]), /* ... */);
}
C ++ 11可变参数模板支持此功能。你如何在D?
做同样的事情答案 0 :(得分:7)
这是一个更新版本,可以编译最新版本的D编译器:
/**
Return a Tuple expression of $(D Func) being
applied to every tuple argument.
*/
template Map(alias Func, args...)
{
static auto ref ArgCall(alias Func, alias arg)() { return Func(arg); }
static if (args.length > 1)
alias Map = TypeTuple!(ArgCall!(Func, args[0]), Map!(Func, args[1 .. $]));
else
alias Map = ArgCall!(Func, args[0]);
}
///
unittest
{
import std.conv;
int square(int arg)
{
return arg * arg;
}
int refSquare(ref int arg)
{
arg *= arg;
return arg;
}
ref int refRetSquare(ref int arg)
{
arg *= arg;
return arg;
}
void test(int a, int b)
{
assert(a == 4, a.text);
assert(b == 16, b.text);
}
void testRef(ref int a, ref int b)
{
assert(a++ == 16, a.text);
assert(b++ == 256, b.text);
}
int a = 2;
int b = 4;
test(Map!(square, a, b));
test(Map!(refSquare, a, b));
assert(a == 4);
assert(b == 16);
testRef(Map!(refRetSquare, a, b));
assert(a == 17);
assert(b == 257);
}
答案 1 :(得分:6)
这是我提出的最好的:
auto staticMappedCall(alias call, alias F, T...)(T t)
{
T a;
foreach(i, arg; t)
a[i] = F(arg);
return call(a);
}
你这样使用它:
staticMappedCall!(bar,t)(1, 2);
其中bar是要调用的函数,t是转换。
void bar(int a, int b) { writeln(a, " ", b); }
int t(int a) { return a*2; }
staticMappedCall!(bar, t)(1, 2);
> test
2 4