2012-04-11 30 views
27

Tôi có một số lớp C và muốn chuyển địa chỉ của cá thể và phương thức của nó cho một số hàm trong hàm kiểm tra Test_C_Foo1(). Functor là một lớp mẫu và tôi phải cung cấp kiểu phương thức lớp (MEMFN1) làm một trong các tham số mẫu của nó. Tôi phải xác định loại MEMFN1 ở đâu đó nhưng không muốn thay đổi C.h và không muốn gây ô nhiễm không gian tên chung với nó. Tôi đã quyết định bản địa hóa typedef càng nhiều càng tốt để đặt nó bên trong chức năng kiểm tra - trong phạm vi nơi thực tế sử dụng MEMFN1. Có sử dụng typedef bên trong cơ thể chức năng hay không?Là typedef bên trong của một cơ quan chức năng một thực hành lập trình xấu?

tiêu chuẩn cho phép sử dụng typedef bên trong một cơ quan chức năng, hạn chế nó chỉ trong những trường hợp đặc biệt:

Từ khoá typedef không được kết hợp trong một decl-specifier-seq với bất kỳ loại khác của specifier ngoại trừ một loại-specifier, và nó sẽ không được sử dụng trong khai báo-specifier-seq của khai báo tham số (8.3.5) và cũng không khai báo-specifier-seq của định nghĩa hàm (8.4).

Dưới đây là đoạn mã:

C.h:

... 
#include <string> 
... 

class C 
{ 
public: 
    int foo1(const std::string&);  
}; 

main.cpp:

... 
#include "C.h" 
... 

void Test_C_Foo1() 
{ 
    typedef int(C::*MEMFN1)(const std::string&); 

    C c; 
    Functor1<C, MEMFN1,...> f1(&c, &C1::foo1,...); 
    ... 
} 

... 

int main() 
{ 
    Test_C_Foo1(); 
    return 0; 
} 
+1

Nó chỉ là tốt. – Mat

+0

Các bạn, cảm ơn các câu trả lời của bạn. Thu hẹp phạm vi của * typedef * trong trường hợp này dường như là sự lựa chọn tự nhiên đối với tôi và tôi đã nghi ngờ chỉ vì tôi không thể nhớ nếu tôi đã từng xem qua nó trong mã hay văn học. –

+0

Bạn có thể sử dụng 'decltype' với C++ 11 không? –

Trả lời

45

Đó là tốt. Đó là hợp pháp và bản địa hóa.

+6

Nó là tốt hơn: đôi khi là * cần thiết *. Hãy nghĩ về 'typedef' như một loại" gán biến kiểu ". –

-4

IMHO, nếu typedef chỉ là để tránh nhập hoặc để làm cho hàm trỏ thành viên ít cồng kềnh hơn, như ví dụ của bạn cho thấy, thì đó là tốt.

Nhưng nếu typedef tiết lộ một số khái niệm cụ thể, thì nó sẽ hiển thị bên ngoài chức năng.

Một thử nghiệm nhanh để kiểm tra xem nó là tên của typedef:

typedef int(C::*MEMFN1)(const std::string&); //OK: as local typedef, just an abbreviation 

typedef int(C::*ACTION)(const std::string&); //Not so OK: Action is a new concept 
+7

Bạn đang nói rằng nếu một cái tên có nghĩa là một cái gì đó, thì nó phải là toàn cầu? Đó là một quan điểm kỳ lạ. –

+1

@MikeSeymour - Vâng, đó là một hướng dẫn chung. Và không hoàn toàn chính xác, nhưng có thể nhìn thấy bên cạnh các khái niệm khác mà nó bổ sung. Ví dụ, nếu typedef 'ACTION' có ý nghĩa, nó phải được định nghĩa bên cạnh lớp' C'. – rodrigo

+1

tại sao downvote này, chaps? mọi người đều xúc phạm triết học lập trình, một lần nữa? :) ..thậm chí có IMHO, và điều này nghe có giá trị ở đây, ..IMHO :)) – mlvljr

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