Почему шаблон функции работает с int [], а не с массивами char [] в D? - PullRequest
1 голос
/ 23 октября 2019

Допустим, у нас есть простой шаблон функции 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[] - нет. В чем причина такого поведения?

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Обратите внимание, что в вашей функции есть аргументы одного и того же типа: T[] и T.

Замените T-заполнитель в целом подписи. : int[], int работает для вашего массива и длины ... но с char, char[], char, теперь у вас есть проблема: len возвращает size_t (иначе uint на 32-битной, поэтому вы видите это всообщение об ошибке), которое не совпадает с char.

Возможно, я бы просто сделал второй параметр size_t напрямую вместо T или передал ему какую-то другую вещь.

Просто помните, что эти заполнители в определении функции всегда будут одинаковыми при каждом упоминании в конкретном вызове.

0 голосов
/ 23 октября 2019

Это просто, твой код не верен и не имеет смысла. Код ошибки конца правильный. Так что я не вижу здесь никакой проблемы.

Вот исправленный код:

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));
    }

ОБНОВЛЕНИЕ:

Я также отправляю это(без объяснения причин), но ответ Адама идеален, поэтому нет причин повторять его

...