5

sortDの関数をテンプレート引数として関数に送信しようとしてい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"ですか?そして、私がやろうとしていることの正しい構文はありますか?

アップデート

sortOK、関数をラップしようとしました。次のコードが機能します。

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"は失敗します。関数呼び出しが機能する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 に答える