2011-09-12 66 views
5

Dưới đây là một ý tưởng chung về cách lớp học của tôi được định nghĩa là (nó thực hiện các hoạt động khác so với những gì được đề cập dưới đây)std :: sử dụng for_each về chức năng thành viên với hai args

struct Funktor 
{ 
    Funktor(int val):m_val(val){} 
    bool operator()(int arg1, int arg2) { return m_val==arg1*arg2; } 
    int m_val; 
}; 

Và bây giờ tôi có một vector của các đối tượng trên, và tôi đang cố gắng gọi toán tử() bằng cách sử dụng for_each, có cách nào để làm điều này không? Tôi biết nó có thể được thực hiện bằng cách sử dụng bind2nd và mem_func_ref nhưng khi chỉ có một đối số nhưng đối với hai đối số tôi đã không tìm thấy một cách.

int main() 
{ 
    std::vector<Funktor> funktors; 
    funktors.push_back(Funktor(10)); 
    funktors.push_back(Funktor(20)); 
    funktors.push_back(Funktor(30)); 

    int arg1 = 5, arg2 = 6; 
    //instead of the for loop below I want to use for_each 
    for(std::vector<Funktor>::iterator itr = funktors.begin(); funktors.end() != itr; ++itr) 
    { 
     (*itr)(arg1,arg2); 
    } 
} 

Cảm ơn bạn đã được trợ giúp. Tốt.

CV

+1

Bạn có thể làm rõ lý do bạn muốn thực hiện việc này không? Nó trông giống như một no-op hiệu quả. –

+0

@Mark: Bạn có nghĩa là các nhà điều hành() không làm bất cứ điều gì? Nó chỉ là để cho một ý tưởng về cấu trúc của lớp tôi. – blueskin

+0

@ blueskin: Ông có nghĩa là 'std :: for_each' loại bỏ kết quả từ functor của nó được đưa ra, do đó,' bool's trả về sẽ không bao giờ được sử dụng, làm cho mẫu cụ thể này vô nghĩa. – ildjarn

Trả lời

7

C++ 03 Solution (không tăng):

Viết functor khác như:

struct TwoArgFunctor 
{ 
    int arg1, arg2; 
    TwoArgFunctor(int a, int b) :arg1(a), arg2(b) {} 

    template<typename Functor> 
    bool operator()(Functor fun) 
    { 
     return fun(arg1, arg2); //here you invoke the actual functor! 
    } 
}; 

Sau đó, sử dụng nó như:

std::for_each(funktors.begin(),funktors.end(), TwoArgFunctor(arg1,arg2)); 

Giải pháp C++ 11:

std::for_each(funktors.begin(),funktors.end(), 
         [&] (Funktor f) -> bool { return f(arg1,arg2); }); 
+0

Giải pháp C++ 03 sẽ hoạt động. Cảm ơn. Ngoài ra, cú pháp '[&] (Funktor f) -> bool' có vẻ buồn cười, tôi có thể hỏi nó chính xác là gì không? – blueskin

+0

@ blueskin: Bạn có thể làm quen với cú pháp hài hước ở đây: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions – Nawaz

+1

cảm ơn liên kết Nawaz – blueskin

Các vấn đề liên quan