gpt4 book ai didi

templates - 将模板化函数作为参数发送到 D 中的模板化函数

转载 作者:行者123 更新时间:2023-12-03 20:29:47 26 4
gpt4 key购买 nike

我正在尝试发送 D 的 sort函数作为 pipe 的模板参数功能。当我使用 sort没有模板参数它的工作原理:

import std.stdio,std.algorithm,std.functional;

void main()
{
auto arr=pipe!(sort)([1,3,2]);
writeln(arr);
}

但是,当我尝试使用 sort 时使用模板参数:
import std.stdio,std.algorithm,std.functional;

void main()
{
auto arr=pipe!(sort!"b<a")([1,3,2]);
writeln(arr);
}

我收到一个错误 - main.d(5): Error: template instance sort!("b<a") sort!("b<a") does not match template declaration sort(alias less = "a < b",SwapStrategy ss = SwapStrategy.unstable,Range)
为什么会发生? sort!"b<a"它自己工作,它具有与 sort 相同的参数和返回类型。 ,那么为什么 pipe接受 sort但不是 sort!"b<a" ?我尝试做的事情有正确的语法吗?

更新

好的,我已经尝试包装 sort功能。以下代码有效:
import std.stdio,std.algorithm,std.functional,std.array;

template mysort(string comparer)
{
auto mysort(T)(T source)
{
sort!comparer(source);
return source;
}
}

void main()
{
auto arr=pipe!(mysort!"b<a")([1,3,2]);
writeln(arr);
}

那么为什么原始版本不起作用呢?这是因为额外的模板参数 sort需要?

最佳答案

是的,这是因为额外的模板参数——特别是 Range范围。问题可以简化为

size_t sort2(alias f, Range)(Range range)
{
return 0;
}
alias sort2!"b<a" u;

实例化 sort!"b<a"将失败,因为范围未确定。函数调用 sort2!"b<a"([1,2,3])工作是因为参数 [1,2,3]可以告诉编译器类型 Range 是 int[] .这称为“隐式函数模板实例化 (IFTI)”。但是 IFTI 仅在用作函数时才有效。在您的用例中, sort!"b<a"在不提供所有参数的情况下实例化,因此错误。

这可以通过使输入成为函数文字来解决,这与您的 mysort 类似。解决方案:
 auto arr = pipe!(x => sort!"b<a"(x))([1,3,2]);

或者您可以提供所有必需的模板参数。这使得代码非常不可读。
auto arr = pipe!(sort!("b<a", SwapStrategy.unstable, int[]))([1,3,2]);

关于templates - 将模板化函数作为参数发送到 D 中的模板化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9639498/

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