Передача определенной функции шаблону

#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 . Однако это неявное преобразование создаст временный объект, который не может быть передан в качестве ссылки. Но для временных объектов принимается постоянная ссылка.