2011-07-30 41 views
7

Đôi khi, tôi cần một số trình trợ giúp hàm functor để thao tác danh sách. Tôi cố gắng giữ phạm vi địa phương càng tốt.cách xác định hàm functor bên trong hàm

#include <iostream> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    struct Square 
    { 
     int operator()(int x) 
     { 
      return x*x; 
     } 
    }; 

    int a[5] = {0, 1, 2, 3, 4}; 
    int b[5]; 

    transform(a, a+5, b, Square()); 

    for(int i=0; i<5; i++) 
     cout<<a[i]<<" "<<b[i]<<endl; 
} 

hello.cpp: In function ‘int main()’: 
hello.cpp:18:34: error: no matching function for call to ‘transform(int [5], int*, int [5], main()::Square)’ 

Nếu tôi chuyển Square ra khỏi main(), đó là ok.

+0

[Xem câu hỏi này] (http://stackoverflow.com/questions/6880077/why-does-this-stdsort-predicate-fail-when-the-class-is-inside-main). – hammar

+0

Hmm ... Tôi đã sao chép mã từ câu hỏi và thử nó trên VS2010, và nó hoạt động tốt ...: - \. – TCS

Trả lời

6

Bạn không thể làm điều đó. Tuy nhiên, trong một số trường hợp, bạn có thể sử dụng các thư viện boost::bind hoặc boost::lambda để xây dựng các thư viện mà không cần khai báo cấu trúc bên ngoài. Ngoài ra, nếu bạn có một trình biên dịch gần đây (ví dụ như phiên bản gcc 4.5), bạn có thể kích hoạt tính năng C++ mới 0x cho phép bạn sử dụng biểu thức lambda, cho phép cú pháp như:

transform(a, a+5, b, [](int x) -> int { return x*x; });

+0

+1 cho ghi chú "0x có thể làm điều đó". – bitmask

6

Trong tiêu chuẩn hiện hành (C++ 98/03) các lớp địa phương (các hàm địa phương) không thể được sử dụng như các lớp như một tham số mẫu.

-1

Tôi nghĩ câu trả lời hay nhất cho câu hỏi này là "Sử dụng ngôn ngữ lập trình functional".

+2

Thẻ là một phần của câu hỏi, do đó, mặc dù đó là câu trả lời cho một câu hỏi hơi giống với câu hỏi này, tôi không nghĩ đó là câu trả lời cho câu hỏi này. –

0

Như được chỉ ra bởi một số câu trả lời ở đây, C++ pre-0x không thể sử dụng kiểu địa phương làm đối số mẫu. Những gì tôi thường làm để vượt qua vấn đề này (ngoài hy vọng các dự án tôi làm việc sẽ chuyển sang C++ 0x sớm) là đặt lớp địa phương tương ứng như một lớp lồng nhau riêng trong lớp của hàm thành viên cần hàm functor này. Ngoài ra, đôi khi tôi đặt functor trong tệp .cpp tương ứng, tưởng tượng rằng nó là sạch hơn (và nhanh hơn một chút để biên dịch).

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