Tôi có một vectơ thuộc kiểu người dùng được xác định (Sinh viên). Tôi có 2 chức năng gần như giống hệt nhau ngoại trừ một cuộc gọi hàm duy nhất bên trong chúng.Chuyển thuật toán STL sang một hàm khác
Đây là 2 chức năng:
Student lowest_grade(const std::vector<Student> &all_students){
return *std::min_element(std::begin(all_students), std::end(all_students),
[](const Student &a, const Student &b){
return a.get_average() < b.get_average();});
}
Student highest_grade(const std::vector<Student> &all_students){
return *std::max_element(std::begin(all_students), std::end(all_students),
[](const Student &a, const Student &b){
return a.get_average() < b.get_average();});
}
Cả hai chức năng đang làm việc một cách chính xác để sử dụng của tôi, nhưng nó có vẻ như điều này dễ dàng có thể được xây dựng tốt hơn. Tôi muốn tạo một hàm mà tôi có thể chuyển vào hoặc min_element hoặc max_element, chẳng hạn như:
template <typename func>
Student dispatch(const std::vector<Student> &all_students, func){
return *func(std::begin(all_students), std::end(all_students),
[](const Student &a, const Student &b){
return a.get_average() < b.get_average();});
}
Nhưng tôi không thể quản lý để làm việc này hoạt động bình thường. Tôi không chắc chắn làm thế nào để đi về việc này.
EDIT - Đây là cách tôi đang gọi hàm văn + thông báo lỗi:
std::cout<<"lowest: "<< dispatch(all_students, std::max_element);
Các thông báo lỗi là:
g++ m.cpp -std=c++11 -Wall -o main
m.cpp: In function ‘int main()’:
m.cpp:86:63: error: missing template arguments before ‘(’ token
std::cout<<"lowest: "<< dispatch(all_students, std::function(std::max_element));
^
[email protected]:~/Desktop/Prog/daily/167m$ make
g++ m.cpp -std=c++11 -Wall -o main
m.cpp: In function ‘int main()’:
m.cpp:86:81: error: no matching function for call to ‘dispatch(std::vector<Student>&, <unresolved overloaded function type>)’
std::cout<<"lowest: "<< dispatch<std::function>(all_students, std::max_element);
^
m.cpp:86:81: note: candidate is:
m.cpp:71:9: note: template<class func> Student dispatch(const std::vector<Student>&, func)
Student dispatch(const std::vector<Student> &all_students, func){
^
m.cpp:71:9: note: template argument deduction/substitution failed:
Bạn có thể giải thích chi tiết về cách nó không hoạt động không? Đặc biệt xin vui lòng cho thấy cách bạn sử dụng hàm 'dispatch' của bạn. –
Trong trường hợp bạn đang tính cả phút và tối đa cùng một lúc, hãy tính đến [std :: minmax_element] (http://en.cppreference.com/w/cpp/algorithm/minmax_element). –