2
T maybe(alias nullCheck, T)(T expr, T def)
{
    if (nullCheck(expr))
    {
        return def;
    }
    else
    {
        return expr;
    }
}

auto tokens = chomp(readln())
              .toLower()
              .split()
              .maybe!(a => a.empty)([""])

へのテンプレート引数maybeが、エイリアスが最初になるように配置されている場合、コンパイラは引数の型を正しく推測できます。ただし、T が最初に来るようにテンプレート引数が切り替えられると、それらを推論できず、コンパイルされません。どうしてこれなの?

4

1 に答える 1

3

これは、テンプレート引数がすべての位置引数の後にあるためです。nullCheckが 2 番目の引数の場合、 を指定するT前に最初に指定する必要がありますnullCheck

コンパイラは、デフォルトの引数であるかのように、最後の位置引数の右側にある引数のみを (非公式に) 推測しようとすることができます。

これは C++ の場合と同じであり、考えてみれば合理的であることに注意してください。

于 2013-04-17T07:18:16.033 に答える