Tôi đã chơi về với functors trong C + +. Đặc biệt, tôi đã có một vectơ cặp tôi muốn sắp xếp theo yếu tố đầu tiên của cặp. Tôi bắt đầu viết một functor hoàn toàn chuyên biệt (tức là một cái gì đó như "bool MyLessThan (MyPair & lhs, MyPair & rhs)"). Sau đó, chỉ vì loại công cụ này là thú vị, tôi muốn thử viết một "Áp dụng F cho các yếu tố đầu tiên của cặp này" functor. Tôi đã viết dưới đây, nhưng g ++ không thích nó. Tôi nhận được:g ++ từ chối functor đơn giản của tôi với "mong đợi một loại, có 'xyz'"
lỗi: Loại/giá trị không phù hợp với lập luận 2 trong danh sách tham số mẫu cho 'mẫu struct Pair1stFunc2' lỗi: mong đợi một loại, có 'ít'
#include <algorithm>
#include <functional>
#include <utility>
#include <vector>
template <class P, class F>
struct Pair1stFunc2
{
typename F::result_type operator()(P &lhs, P &rhs) const
{ return F(lhs.first, rhs.first); }
typename F::result_type operator()(const P &lhs, const P &rhs) const
{ return F(lhs.first, rhs.first); }
};
typedef std::pair<int,int> MyPair;
typedef std::vector<MyPair> MyPairList;
MyPairList pairs;
void foo(void)
{
std::sort(pairs.begin(),
pairs.end(),
Pair1stFunc2<MyPair, std::less>());
}
bất cứ ai có thể rụng bất kỳ ánh sáng trên những gì tôi đang làm sai ở đây? Tôi biết đây là ví dụ nhân tạo một chút, nhưng tôi muốn biết chuyện gì đang diễn ra, nếu chỉ để cải thiện STL-fu của tôi.
Khi bạn giải quyết vấn đề này, bạn sẽ có một thứ khác vì F là một loại. Bạn đang xây dựng một F mới bằng cách sử dụng lhs.first và rhs.first. Bạn sẽ thấy rằng std :: less không có một hàm tạo hai tham số. Bạn cần có một giá trị * * loại F. –
Đây là một cái gì đó để cải thiện tăng của bạn :: bind-fu: sắp xếp (p.begin(), p.end(), bind (ít hơn(), bind (& MyPair: : đầu tiên, _1), liên kết (& MyPair :: đầu tiên, _2))); ;) http://codepad.org/NouR5fko –