我在D中有一个元组。我想在该元组上应用元素操作,并获得转换后的元组以传递给另一个接受可变参数模板参数的函数。转换的执行路径是在编译时定义的,但实际值不是。
这与C ++的bind
构造中使用的模板机制类似,用于确定在何处使用占位符/传递的参数以及在编译时使用存储的参数的位置。
我如何做到这一点?
这是第一次在D中我错过了C ++ 11模板系统中的一个功能:打包/解包操作符 - 请让我不要心疼: - (
编辑:使用mixin
结束,因为显然您想要的任何通用编程解决方案都可以通过使用它们来解决。如果没有人提出任何更优雅的东西,可以回答他们,而不是将D的可怕的强大的手持式通用编程工具带到它上面。
答案 0 :(得分:3)
元组的元素可以是模板别名参数可以是的任何元素。但是,运行时表达式不能是别名参数 - 它们在编译时进行评估。因此,不可能使用在编译时运行的转换来转换元组(除了转换定义返回结果的@property函数之外的变通方法)。
如果可以在编译时评估表达式和转换 ,请参阅std.typetuple中的staticMap。
答案 1 :(得分:0)
如果我理解正确的问题,那么这是可能的,但这是一个高度实验性的(无证件,并不能保证始终有效)功能:
import std.stdio;
import std.traits;
import std.typetuple;
ReturnType!Call Delay(alias Call, alias arg)() { return Call(arg); }
template Map(alias Call, args...)
{
static if (args.length > 1)
alias Map = TypeTuple!(Delay!(Call, args[0]),Map!(Call, args[1..$]));
else
alias Map = Delay!(Call, args[0]);
}
int square(int arg)
{
return arg * arg;
}
void print(int res1, int res2)
{
writefln("%s %s", res1, res2); // writes '25 100'
}
void test(Args...)(Args args)
{
print(Map!(square, args));
}
void main()
{
int x = 5;
int y = 10;
test(x, y);
}