2012-02-09 6 views
17

Tôi thường sử dụng tiện ích Boost typedef mạnh mẽ để cải thiện sự an toàn của các chương trình của tôi. Ví dụ: bằng cách viết mã như sau:Sử dụng typedef mạnh làm phương án thay thế nhẹ hơn cho thư viện Tham số tăng cường?

BOOST_STRONG_TYPEDEF(int, X) 
BOOST_STRONG_TYPEDEF(int, Y) 
BOOST_STRONG_TYPEDEF(int, Width) 
BOOST_STRONG_TYPEDEF(int, Height) 

struct Rect { 
    Rect(X x, Y y, Width w, Height h); 
}; 

// Usage: 
Rect rect(X(10), Y(20), Width(800), Height(600)); 

Kiểu chữ mạnh ở đây cải thiện cả khả năng đọc và an toàn của mã. (Trình biên dịch sẽ báo lỗi nếu các đối số được cung cấp theo thứ tự sai, mà sẽ không có được các trường hợp nếu các đối số đều int.)

Câu hỏi của tôi là:

  • Is it ok để sử dụng BOOST_STRONG_TYPEDEF cho mục đích này? (Tài liệu là very brief.)
  • Có lý do quan trọng nào để thích thư viện tham số tăng hơn?
+1

phụ thuộc vào ý của bạn là 'ok', nó biên dịch và chạy tôi giả định, vậy điều gì là sai với điều đó. Tôi thấy logic của bạn đằng sau điều này, nhưng có vẻ như 'sai' đối với tôi. Có một lý do bạn có thể đặt tên biến và paramaters, do đó, có một số một cách rõ ràng cast có 'int' đến một' Width' chỉ để vượt qua nó để thiết lập tham số 'width' có vẻ sai. Mặc dù có thể có ích để có 'set (width w);' v.v. chỉ với 'int' bạn không thể làm điều đó.Tham số tăng cường – thecoshman

+1

dành cho các đối số được đặt tên (và thậm chí là tùy chọn), trong khi BOOST_STRONG_TYPEDEF * sẽ tạo một loại "tên" mới sẽ thay thế cho loại ban đầu nhưng vẫn thuộc loại riêng biệt *. – Gigi

Trả lời

18

Về mặt kỹ thuật nói:

  • nó hoạt động
  • nó thêm gõ an toàn

Thực tế nói:

tôi sẽ không khuyên bạn nên tạo kiểu mới chỉ vì lợi ích của một hàm của đơn tham số (trừ khi nó là một enum cụ thể cho chức năng này), các loại nên thấm vào ứng dụng để tránh các phôi được sử dụng hơn và hơn.

Nếu các loại X, Y, WidthHeight được sử dụng trong suốt ứng dụng, sau đó không chỉ sẽ có không có dàn diễn viên, nhưng ứng dụng của bạn sẽ an toàn hơn nhiều và tốt hơn nhiều tài liệu quá (yeah ... Tôi là một loại freak).

Bây giờ, liên quan đến Boost.Parameters, điều này hoàn toàn khác.

Tăng. Các tham số có thể được thêm (có khả năng) khi bạn có sẵn các loại. Thành thật mà nói tôi không bao giờ thấy sự cần thiết. Khi chức năng của bạn phát triển quá khó sử dụng mà Boost.Parameters là cần thiết để gọi cho họ, bạn nên sửa chữa các chức năng, không thêm vào lộn xộn.

+2

+1 Hoan hô các loại tài liệu! – pyon

+0

Tôi tin rằng các thông số được đặt tên đặc biệt phù hợp với các thư viện chung chung không thể quyết định cho người dùng của họ cái gì được coi là "lộn xộn", và vẫn muốn quá tải mô hình quá tải quá tải – sehe

+0

Trường hợp sử dụng hợp lệ cho boost.parmater trong đầu tôi là chức năng nhà máy với nhiều tham số mặc định – odinthenerd

2

Sử dụng BOOST_STRONG_TYPDEF đang tạo loại mới, trong đó thư viện tham số tăng là cung cấp tên cho tham số. Nó cho phép bạn rõ ràng hơn với các chức năng của bạn. Ví dụ: (từ tài liệu tăng cường)

#include <boost/parameter/preprocessor.hpp> 

namespace graphs 
{ 
    BOOST_PARAMETER_FUNCTION(
     (void),    // 1. parenthesized return type 
     depth_first_search, // 2. name of the function template 

     tag,     // 3. namespace of tag types 

     (required (graph, *)) // 4. one required parameter, and 

     (optional    // four optional parameters, with defaults 
     (visitor,   *, boost::dfs_visitor<>()) 
     (root_vertex,  *, *vertices(graph).first) 
     (index_map,   *, get(boost::vertex_index,graph)) 
     (in_out(color_map), *, 
      default_color_map(num_vertices(graph), index_map)) 
    ) 
) 
    { 
     // ... body of function goes here... 
     // use graph, visitor, index_map, and color_map 
    } 
} 

Cho phép bạn nói rõ ràng những gì được mong đợi, gần như trong thiết kế theo cách sắp xếp hợp đồng. Tuy nhiên tôi thấy điều này làm phức tạp khả năng đọc mã của bạn đủ để làm cho nó không đáng làm.

Cá nhân tôi thích sử dụng BOOST_STRONG_TYPEDEF vì nó tạo ra một loại mới "có thể được sử dụng cho phù hợp với một trong hai chức năng hoặc mẫu thông số" (một lần nữa từ các tài liệu hướng tăng).