【问题标题】:Why does function template work with int[] but not with char[] arrays in D?为什么函数模板可以与 int[] 一起使用,但不能与 D 中的 char[] 数组一起使用?
【发布时间】:2019-10-22 21:36:42
【问题描述】:

假设我们有一个简单的 D 函数模板,它返回一个数组的长度:

size_t len(T)(T[] arr) {
    return arr.length;
}

我们有两个数组:

int[] arr0 = [1, 1, 2, 3, 5, 8];
char[] arr1 = ['a', 'b', 'c', 'd', 'e'];

现在,我还需要一个函数模板,它可以漂亮地打印上述len 函数模板的输入和结果。

void writeResult(T)(T[] param, T result) {
    import std.stdio;
    import std.format;
    writeln(format("%s --> %s", param, result));
}

现在让我们用我们的两个数组测试len

writeResult(arr0, len(arr0)); // [1, 1, 2, 3, 5, 8] --> 6
writeResult(arr1, len(arr1)); // writeResult cannot deduce function from argument types !()(char[], uint), candidates are:
test.d(4): writeResult(T)(T[] param, T result)

对于这两种情况,我们都有返回类型 size_t,但使用 int[] 数组它可以工作,而使用 char[] 数组它不能。这种行为的原因是什么?

【问题讨论】:

    标签: d


    【解决方案1】:

    需要注意的是,您的函数的参数基本上都是同一类型:T[]T

    在整个整个签名中替换 T 占位符:int[], int 适用于您的数组和长度...但是使用字符,char[], char,现在您遇到了问题:len 返回@ 987654326@(又名 uint 在 32 位上,这就是您在错误消息中看到的原因),它与 char 不同。

    我可能只是直接创建第二个参数size_t 而不是T,或者传递一些其他的东西给它。

    请记住,函数定义中的那些占位符在特定调用中每次被提及时总是相同的。

    【讨论】:

    • 啊。那是因为T 不能在单个模板中推导出为intchar,对吧?我认为T 可以是char[] 一个参数和size_t 另一个。
    • 不,每个编译时间参数只能有一个值。如果您想要两种不同的东西,请按void foo(T, R)(T one, R, another){}
    • 我写错了最后一条评论应该是(T one, R another)。很明显,但仍然
    【解决方案2】:

    很容易你的代码是错误的,没有意义。结束错误代码是正确的。所以我在这里没有看到任何问题。

    这里是固定代码:

    https://run.dlang.io/is/IitSmF

    size_t len(T)(T[] arr) {
        return arr.length;
    }
    
    int[] arr0 = [1, 1, 2, 3, 5, 8];
    char[] arr1 = ['a', 'b', 'c', 'd', 'e'];
    
    void writeResult(T)(T[] param, size_t result) {
        import std.stdio;
        import std.format;
        writeln(format("%s --> %s", param, result));
    }
    
    void main()
    {
        writeResult(arr0, len(arr0));
        writeResult(arr1, len(arr1));
    }
    
    

    更新:

    我发的太早了(没有解释),但亚当的答案很完美,所以没有理由重复它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-31
      • 2018-09-18
      • 2019-06-19
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多