2012-05-07 45 views
16

Tôi viết một chương trình sử dụng thư viện Chương trình Tùy chọn Boost và tôi nhận thấy cú pháp sau đó đã ám ảnh tôi kể từ khi tôi nhìn thấy nó:Tăng Tùy chọn Chương trình Thêm Tùy chọn Cú pháp

desc.add_options() 
     ("help","produce help message") 
     (/* other flag, value, description pairs here */) 
; 

Tôi thấy rằng trong tiêu đề, điều hành() bị ghi đè, nhưng tôi không chắc làm thế nào cho phép điều này được chính xác cú pháp.

Thứ hai, có lợi thế nào đối với cú pháp này không, so với chỉ gọi add_options() nhiều lần (ngoài việc hiển thị thực tế là bạn có thể thao tác cú pháp như thế này)?

+5

Tác giả Boost thích thể hiện ... –

+0

"Haunted" là một mô tả hay ... Tôi nhận được nó chính thức, nhưng "cảm thấy" lạ ... – thomastiger

Trả lời

16

Chức năng thành viên add_options trả về đối tượng thuộc loại options_description_easy_init. Sau này có quá tải operator() để trả lại tham chiếu cho chính nó. Điều này cho phép bạn chuỗi các cuộc gọi như bạn đã hiển thị trong đoạn mã.

Sự khác biệt giữa chaining các cuộc gọi và gọi add_options nhiều lần là trong trường hợp cựu một trường hợp duy nhất của options_description_easy_init được tạo ra và mỗi lần bạn gọi operator() vào nó, nó bổ sung thêm các tùy chọn cho chủ sở hữu (options_description). Nếu bạn gọi số add_options nhiều lần, mỗi cuộc gọi sẽ tạo một phiên bản mới là options_description_easy_init.

+1

+1 cho cách thức, nhưng nó vẫn cầu xin câu hỏi: tại sao? – paulrehkugler

+0

@paulrehkugler [câu trả lời] của Nicol (http://stackoverflow.com/a/10487655/241631) giải thích lý do tại sao – Praetorian

12

Câu hỏi về lợi thế là chủ quan, nhưng trong trường hợp này, nó ngắn gọn.

Hãy so sánh này từ một trong các dự án nhà tôi:

("help,h", "Generate this help message") 
("output-file,o", po::value<std::string>(), "Output filename. Required.") 
("tangent,t", "Generate/load tangent-space basis.") 
("collada-output,c", "Write a Collada file, rather than our mesh XML format.") 
("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing.") 
("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent.") 
("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file.") 
("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n" 
     "Name # # # #\n" 
     "\n" 
     "Each # is an attribute index to use for this VAO.\n" 
     "Each VAO name must be unique; you cannot use the same VAO in the same place.") 

này:

visible.add_options()("help,h", "Generate this help message") 
visible.add_options()("output-file,o", po::value<std::string>(), "Output filename. Required.") 
visible.add_options()("tangent,t", "Generate/load tangent-space basis."); 
visible.add_options()("collada-output,c", "Write a Collada file, rather than our mesh XML format."); 
visible.add_options()("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing."); 
visible.add_options()("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent."); 
visible.add_options()("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file."); 
visible.add_options()("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n" 
     "Name # # # #\n" 
     "\n" 
     "Each # is an attribute index to use for this VAO.\n" 
     "Each VAO name must be unique; you cannot use the same VAO in the same place."); 

vấn đề dài dòng. Và không cần phải có visible.add_options() trước mọi thứ giúp dễ đọc hơn.

+0

Tôi nghi ngờ đó là lợi thế duy nhất. Theo ý kiến ​​của tôi, đó là một công việc tốt hơn một chút để tạo ra mã đẹp hơn. – paulrehkugler

+0

Cả hai ví dụ đều khá ghê gớm. Bạn có thể định nghĩa 'options_description_easy_init o = visible.add_options()' và chỉ cần gọi 'o (" help "," Generate this help message ");'? – Vortico

+0

@Vortico: Tôi không thấy bất cứ điều gì đặc biệt khó chịu về trường hợp đầu tiên. Thật vậy, tôi không thấy gợi ý của bạn có lợi gì so với cái đầu tiên, ngay cả khi nó hoạt động. Tôi không biết nếu nó sẽ; bạn phải kiểm tra tài liệu của Boost để xem. Nhưng nói chung, nó không phải là một ý tưởng tốt để giữ cho trung gian từ các cấu trúc như thế này. –

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