5

我正在尝试将 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需要吗?

4

1 回答 1

5

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

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

实例化sort!"b<a"将失败,因为 Range 未确定。函数调用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]);
于 2012-03-10T10:51:37.050 回答