gpt4 book ai didi

templates - 在 D 中映射可变参数模板参数

转载 作者:行者123 更新时间:2023-12-04 10:27:11 26 4
gpt4 key购买 nike

是否有任何内置或库提供的方法来映射 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 中做同样的事情?

最佳答案

这是使用最新版本的 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);
}

关于templates - 在 D 中映射可变参数模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com