D 变换元组的每个元素;得到那个元组

D 变换元组的每个元素;得到那个元组,d,D,我在D中有一个元组。我想对该元组应用一个元素操作,并得到转换后的元组,以便传递到另一个接受可变模板参数的函数中。转换的执行路径是在编译时定义的,但实际值不是 其目的类似于C++的bind构造中使用的模板机制,用于确定在何处使用占位符/传递的参数以及在编译时在何处使用存储的参数 我如何做到这一点 这是我在D中第一次错过C++11模板系统中的一个功能:打包/解包操作符-请让我不要难过:-( 编辑:最终使用了mixins,因为显然任何你想要的通用编程解决方案都可以通过使用它们来解决。如果没有人能想出比

我在D中有一个元组。我想对该元组应用一个元素操作,并得到转换后的元组,以便传递到另一个接受可变模板参数的函数中。转换的执行路径是在编译时定义的,但实际值不是

其目的类似于C++的
bind
构造中使用的模板机制,用于确定在何处使用占位符/传递的参数以及在编译时在何处使用存储的参数

我如何做到这一点

这是我在D中第一次错过C++11模板系统中的一个功能:打包/解包操作符-请让我不要难过:-(


编辑:最终使用了
mixin
s,因为显然任何你想要的通用编程解决方案都可以通过使用它们来解决。如果没有人能想出比使用D的功能强大得可笑的jackhammer-of-a-generic-programming-tool更优雅的方法,那么可以使用它们来回答。

元组的元素可以是任何模板都可以使用的东西别名参数可以是。但是,运行时表达式不能是别名参数-它们是在编译时计算的。因此,不可能使用在编译时运行的转换来转换元组(排除变通方法,例如转换定义返回结果的@property函数)


如果表达式和转换可以在编译时进行计算,请参阅std.typetuple。

如果我正确理解这个问题,那么这是可能的,但它是一个高度实验性的(未记录且不能保证始终工作)功能:


最初在这里被问到:

啊,所以我基本上必须像构造表达式那样使用mixin,让它们在运行时运行。我是ma+1,但它在技术上没有回答我的问题。>\u我在可视化你的需求方面遇到了一些困难。你能详细说明一下你想要实现什么吗?我已经知道了。我想要什么我试图复制Boost bind的工作方式(因为无论出于何种原因,std.functional中似乎没有任何东西可以做与占位符等类似的事情)因此,我只想为任何一个参数索引选择存储的绑定参数或传递的参数。因此,我只是把整个函数调用作为一个字符串组成,并将它在.d1中混有STD.BIN,但是它被拒绝赞成D2闭包。只要返回嵌套函数的地址;嵌套函数就可以访问它的PAR。ent函数的局部变量和参数,即使在父函数退出后也是如此。(请注意,这涉及堆分配,并依赖垃圾收集器来清理。)我真的很想避免依赖GC来完成一些看起来很琐碎的事情。诚然,我是理想主义者,但我觉得GC是一个滑梯,如果我开始使用它,我将无法停止,突然我会产生一吨比我需要的多的垃圾。这是其中一个我非常确定我会idn不需要生成垃圾(因为Boost Bind没有垃圾)。我的意思是,我喜欢D使用帧指针处理代理的方式,但我不想完全依赖它。像那样把手举在空中感觉很不对。
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);
}