为什么函数模板适用于 int[] 但不适用于 D 中的 char[] 数组?
Why does function template work with int[] but not with char[] arrays in D?
假设我们有一个简单的 D 函数模板,它 return 是一个数组的长度:
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)
对于这两种情况,我们都有 return 类型 size_t
,但是对于 int[]
数组,它可以工作,而对于 char[]
数组,它不能。这种行为的原因是什么?
需要注意的是,函数的参数基本上都是同一类型:T[]
和 T
。
替换整个 整个 签名中的 T 占位符:int[], int
适用于您的数组和长度...但是对于 char,char[], char
,现在您有问题:len
returns size_t
(在 32 位上又名 uint
,这就是您在错误消息中看到它的原因),这与 char
.
我可能只是直接将第二个参数设为 size_t
而不是 T
,或者将其他参数传递给它。
请记住函数定义中的那些占位符每次在特定调用中被提及时总是相同的。
你的代码很容易出错,没有意义。结束错误码是对的。所以我在这里没有看到任何问题。
这里是固定代码:
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));
}
更新:
我post太早了(没有解释),但亚当的回答很完美,所以没有理由重复
假设我们有一个简单的 D 函数模板,它 return 是一个数组的长度:
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)
对于这两种情况,我们都有 return 类型 size_t
,但是对于 int[]
数组,它可以工作,而对于 char[]
数组,它不能。这种行为的原因是什么?
需要注意的是,函数的参数基本上都是同一类型:T[]
和 T
。
替换整个 整个 签名中的 T 占位符:int[], int
适用于您的数组和长度...但是对于 char,char[], char
,现在您有问题:len
returns size_t
(在 32 位上又名 uint
,这就是您在错误消息中看到它的原因),这与 char
.
我可能只是直接将第二个参数设为 size_t
而不是 T
,或者将其他参数传递给它。
请记住函数定义中的那些占位符每次在特定调用中被提及时总是相同的。
你的代码很容易出错,没有意义。结束错误码是对的。所以我在这里没有看到任何问题。
这里是固定代码:
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));
}
更新:
我post太早了(没有解释),但亚当的回答很完美,所以没有理由重复