#c #function #templates
#c #функция #шаблоны
Вопрос:
Я пытаюсь передать функцию шаблону, и пока я получил это:
template <typename T, typename U> void special_sort(std::vector<T>amp; container, std::vector<U>amp; ordering_container,
std::function<std::vector<std::pair<unsigned int, unsigned int>>(std::vector<U>amp;)>amp; sort_function) {
sort_function(ordering_container);
}
В основном я объявил это:
std::vector<std::pair<unsigned, unsigned>> sort_function(std::vector<int>amp;) {
std::vector<std::pair<unsigned int, unsigned int>> a;
return a;
}
int main() {
std::vector<std::string> test_container = {"a", "b", "c"};
std::vector<int> test_ordering_container = {4,7,2};
auto a = sort_function(test_ordering_container);
special_sort<std::string, int>(test_container, test_ordering_container, sort_function(test_ordering_container));
}
Но я получаю следующую ошибку:
Ошибка (активная) E0304 ни один экземпляр шаблона функции «special_sort» не соответствует списку аргументов Objective_challenge C:Usersmdp11sourcereposObjective_challengeObjective_challengemain.cpp 21 тип аргументов: (
std::vector<std::string
,std::allocator<std::string>>
,std::vector<int, std::allocator<int>>
,std::vector<std::pair<unsigned int, unsigned int>
,std::allocator<std::pair<unsigned int, unsigned int>>>
)
Что я делаю не так? Заранее благодарю вас всех.
Комментарии:
1. чего вы на самом деле хотите достичь? кстати
sort_function(test_ordering_container)
, это не функция, но вы вызываете функцию, и она возвращает вектор, а вектор не является функцией 😉2. Я пытаюсь заставить эту шаблонную функцию получать 3 параметра, вектор T, вектор U и функцию, которая может сортировать второй вектор, но я хочу вызвать эту функцию внутри шаблона «special_sort»
Ответ №1:
Итак, здесь вы получили две ошибки.
Первый заключается в следующем:
special_sort<std::string, int>(
test_container, test_ordering_container,
sort_function(test_ordering_container)
);// --------^-----------------------^
Вместо отправки функции вы вызываете ее и отправляете результат.
Компилятор жалуется на то, что вектор не преобразуется в a 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
в a с удалением типа.
При отправке указателя на функцию в качестве параметра вашей функции он должен создать временный std::function
. Но проблема здесь в том, что temporary не может быть привязан к изменяемой ссылке, только к постоянным:
template <typename T, typename U>
void special_sort(
std::vector<T>amp; container,
std::vector<U>amp; ordering_container,
std::function<std::vector<std::pair<unsigned int, unsigned int>>(std::vector<U>amp;)> constamp; sort_function
) { // -----------------------------------------------------^
}
Или вы также можете использовать параметр шаблона. В этом конкретном случае вам не нужен полиморфизм во время выполнения и стирание типов. Делайте то, что делает STL, и просто принимайте вызываемое по значению:
template <typename T, typename U, typename F>
void special_sort(
std::vector<T>amp; container,
std::vector<U>amp; ordering_container,
F sort_function
) {
// much simpler
// you can still do:
// sort_function(ordering_container)
}
Ответ №2:
Есть две ошибки. Сначала используйте это:
special_sort<std::string, int>(test_container, test_ordering_container, sort_function);
вместо
special_sort<std::string, int>(test_container, test_ordering_container, sort_function(test_ordering_container));
Вы передавали результат функции вместо самой функции.
Вам также необходимо объявить аргумент special_sort
as
const std::function<std::vector<std::pair<unsigned int, unsigned int>>(std::vector<U>amp;)>amp; sort_function
вместо
std::function<std::vector<std::pair<unsigned int, unsigned int>>(std::vector<U>amp;)>amp; sort_function
Поскольку sort_function
ссылается на стандартный вызов функции, его необходимо преобразовать в a std::function
, чтобы иметь возможность вызывать special_sort
. Однако это неявное преобразование создаст временный объект, который не может быть передан в качестве ссылки. Но для временных объектов принимается постоянная ссылка.