Шаблонный аргумент для итераторов: функция выводит тип при вызове? - PullRequest
0 голосов
/ 07 октября 2019

На странице std :: inplace_merge по адресу cppreference.com приведен пример использования inplace_merge для сортировки слиянием. Мой вопрос связан с тем, как они реализовали сортировку слиянием с аргументами шаблона для типа итератора.

Когда вызывается merge_sort в главной функции, аргумент не передается, чтобы сказать, какой тип итератора мы используем. Тем не менее, я скомпилировал этот код, и он работает нормально. Почему вы не должны указывать merge_sort, какой итератор мы используем? Как бы ты это сделал?

#include <vector>
#include <iostream>
#include <algorithm>

template<class Iter>
void merge_sort(Iter first, Iter last)
{
    if (last - first > 1) {
        Iter middle = first + (last - first) / 2;
        merge_sort(first, middle);
        merge_sort(middle, last);
        std::inplace_merge(first, middle, last);
    }
}

int main()
{
    std::vector<int> v{8, 2, -2, 0, 11, 11, 1, 7, 3};
    merge_sort(v.begin(), v.end());  // <----------------- ?
    for(auto n : v) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

1 Ответ

1 голос
/ 07 октября 2019

Это происходит из-за Аргумент шаблона: дедукция

Чтобы создать экземпляр шаблона функции, каждый аргумент шаблона должен быть известен, , но не каждый аргумент шаблона имеетбыть указанным. Когда это возможно, компилятор выведет отсутствующие аргументы шаблона из аргументов функции. Это происходит при попытке вызова функции, при получении адреса шаблона функции и в некоторых других контекстах.

...