Итак, у вас здесь две ошибки.
Во-первых, это:
special_sort<std::string, int>(
test_container, test_ordering_container,
sort_function(test_ordering_container)
);// --------^-----------------------^
Вместо отправки функции вы вызываете ее и отправляете результат.
Компилятор жалуется на вектор, не преобразуемый в std::function
.
special_sort<std::string, int>(
test_container, test_ordering_container,
sort_function
);// ^------ the function itself
Вторая ошибка - получение функции по изменяемой ссылке.
Тип функции , а не std::function
. Тип sort_function
является типом указателя на функцию.
Класс std::function
- это полиморфная обертка вокруг любого вызываемого. Таким образом, лямбда-тип, тип объекта-функции, указатель на функцию и тому подобное могут содержаться в std::function
стертым способом.
При отправке указателя функции в качестве параметра вашей функции он должен создать временную std::function
. Но проблема здесь в том, что временные ссылки не могут быть связаны с изменяемой ссылкой, только константами:
template <typename T, typename U>
void special_sort(
std::vector<T>& container,
std::vector<U>& ordering_container,
std::function<std::vector<std::pair<unsigned int, unsigned int>>(std::vector<U>&)> const& sort_function
) { // -----------------------------------------------------^
}
Или вы также можете использовать параметр шаблона. Вам не нужен полиморфизм времени выполнения и стирание типа в этом конкретном случае. Сделайте то, что делает STL, и просто возьмите вызываемое по значению:
template <typename T, typename U, typename F>
void special_sort(
std::vector<T>& container,
std::vector<U>& ordering_container,
F sort_function
) {
// much simpler
// you can still do:
// sort_function(ordering_container)
}