1

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

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

我该如何做到这一点?

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

编辑:最终使用mixins,因为显然您想要的任何通用编程解决方案都可以通过使用它们来解决。如果没有人想出比使用 D 的可笑强大的手提钻通用编程工具更优雅的东西,可以回答他们。

4

2 回答 2

3

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

如果可以在编译时评估表达式和转换,请参阅std.typetuple中的 staticMap。

于 2013-08-11T00:27:21.633 回答
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);
}

最初在这里问:Mapping variadic template arguments in D

于 2013-08-12T18:59:28.420 回答