2011-01-09 48 views
23

Bạn có thể chia sẻ bất kỳ ví dụ thực tế nào về việc sử dụng Boost::MPL (trừ lambdas), chỉ để cho tôi hiểu rõ hơn về mục đích và lĩnh vực sử dụng thực tế của nó? Tài liệu hướng dẫn MPL có một ví dụ dimensional analysis, nhưng có lẽ vì nó là một ví dụ hàn lâm, nó đã không cho tôi cảm giác Boost :: MPL và khi nào nó có thể được sử dụng hiệu quả.Ví dụ về cách sử dụng thực tế của Boost :: MPL?

Trả lời

11

Tôi đã sử dụng Boost.Mpl để tạo các lớp giống biến thể.

Ví dụ, đưa ra một danh sách loại MPL như thế này:

typedef boost::mpl::set<Foo, Bar, Baz> type_set; 

sau đó tôi sử dụng boost::mpl::fold để xây dựng một chuỗi các lớp học có nguồn gốc từ mỗi khác mà mỗi thêm một std::unordered_set của một trong các loại trong các loại bộ. Kết quả cuối cùng là một lớp có chứa một số unordered_set<Foo>, một số unordered_set<Bar> và một số unordered_set<Baz>.

Và vì lớp được chỉ định theo điều khoản của boost::mpl::set, tôi có thể lặp qua các loại này để tự động tạo các chức năng khác, chẳng hạn như operator== so sánh tất cả unordered_set s.

4

Tôi sử dụng thư viện phân tích chiều được tăng cường hơn gọi là Boost.Units.

Tôi đã phát triển một thư viện phản ánh thời gian biên dịch và sau đó sử dụng thư viện đó để xây dựng một lớp chung cung cấp phản ánh thời gian chạy cho bất kỳ kiểu phản hồi biên dịch nào được truyền vào. để chỉnh sửa các thuộc tính của các loại được phản ánh như vậy.

Đó cũng là điều tối quan trọng đối với việc phân phối các sự kiện trong ứng dụng của chúng tôi. Ví dụ, khi ai đó thay đổi các đơn vị mà họ muốn hệ thống vào, tôi không phải dạy hệ thống rằng các mục mới đã được thêm vào các thiết bị đã cho bởi vì mã sử dụng MPL để phân tích các loại đó và chỉ biết rằng một cái gì đó đã được thêm vào và thay đổi nó.

Tôi vừa sử dụng các kỹ thuật lập trình meta để bọc tín hiệu Qt vào thứ gì đó lấy lại được loại an toàn được loại bỏ bởi hệ thống của chúng và có thể kết nối với bất kỳ thực thể chức năng nào.

Nhưng để nói sự thật, bạn gần như chắc chắn đã sử dụng các kỹ thuật lập trình meta áp dụng thực tế khi bạn đã sử dụng các thuật toán chuẩn như sắp xếp. Việc thực hiện tốt thuật toán sắp xếp sử dụng một dạng lập trình meta ít tiến hóa để phân tích các trình vòng lặp được truyền vào và sau đó sử dụng tính năng chuyển thẻ để khởi tạo thuật toán sắp xếp có khả năng sử dụng đầy đủ các tính năng của các trình vòng lặp đó.

Khá thẳng thắn, nếu bạn không thực hiện lập trình meta thì bạn không sử dụng sức mạnh của C++ và bạn cũng có thể sử dụng thứ gì đó khác.

+2

Tôi nghĩ câu hỏi là về Boost.MPL và không phải là metaprogramming nói chung. – jalf

+0

Bạn không thể nói về MPL mà không có tất cả những thứ dẫn đến nó. –

+2

nhưng bạn có thể hỏi "bạn có sử dụng Boost.MPL" mà không hỏi "bạn có sử dụng bất kỳ ví dụ nào khác về lập trình meta mẫu" hay không, giống như cách bạn có thể hỏi "bạn lái Volvo" mà không hỏi "Bạn có lái xe không " – jalf

13

Thực tế là, Boost.MPL, như Boost.Preprocessor, đang thực sự tạo các khối.

Hầu hết các lần, bạn có thể sử dụng nó thông qua các thư viện khác, vì một số thư viện Boost được xây dựng dựa trên hai thư viện đó.

Ví dụ:

  • Boost.Fusion (mà đi qua khoảng trống giữa thời gian biên dịch và thời gian chạy cõi)
  • Boost.MultiIndex (đối với một giao diện dễ dàng hơn)
  • Boost.Đơn vị (để phân tích chiều)
  • Boost.Variant có thể, tôi nghĩ, cũng phụ thuộc vào nó

Bạn có thể sử dụng nó unknowningly đã :)

3

Để thêm vào câu trả lời của Matthieu, nó cũng được sử dụng khá rộng rãi trong cả hai số Boost.PythonLuabind.

+1

boost.proto, boost.spirit (qi, karma, lex) ... thực sự trong hầu hết các thư viện tăng ... –

3

Tôi sử dụng boost :: mpl (và boost :: fusion) rộng rãi trong thư viện stat_log của mình. Thư viện này cho phép người dùng chỉ định một hệ thống phân cấp các thẻ thống kê và ghi nhật ký và các hành vi liên quan của họ, tức là các loại thống kê theo thẻ (biểu đồ, truy cập, v.v.).

tôi chủ yếu dựa vào lập trình meta để làm điều đúng đắn với người sử dụng thực hiện:

stat_log::writeStat<IP_PKTS_RCVD>(450); 

Ví dụ nếu người dùng định nghĩa kiểu đặc điểm:

template <> 
struct stat_tag_to_type<IP_PKTS_RCVD> 
{ 
    using type = Accumulator< 
     stat_log::HistogramCount< 
      int, 
      1, //start bin 
      1500, //stop bin 
      10 //num_bits 
     > 
    >; 
}; 

các "writeStat" gọi trên sẽ proxy (tại thời gian biên dịch) đến thống kê biểu đồ. Khía cạnh mạnh mẽ của kỹ thuật thiết kế này là trang web gọi "writeStat" không hoàn toàn kết hợp với thống kê cụ thể được chọn.

Tôi cũng sử dụng một lượng lớn MPL và tăng cường :: tổng hợp để thực sự xem thống kê. Mỗi câu hỏi của bạn, xem các tập tin sau đây cho nồng độ cao nhất của tăng :: mpl:

https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/stat_log_impl.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/tag_commander.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/stat_log.h

đặc biệt là tiện lợi mẫu meta "chức năng" trong stat_log_impl.h:

//This template is used in conjunction with an MPL algorithm 
// with the same semantics as mpl::find_if. 
//BoolFunc is the "condition" metafunction. 
//StatTagFunc is a metafunction that transforms the given 
// stat_tag into something the algorithm requires. 
// For example the "Identity" metafunction would work here. 
//StatTagArgs is extra arguments to the BoolFunc 
template <template<typename...> class BoolFunc, 
      template<typename...> class StatTagFunc, 
      class... StatTagArgs> 
struct tag_node_query 
{ 
    template<typename TheTagNode> 
    struct apply 
    { 
     using stat_tag = typename TheTagNode::tag; 
     using type = std::integral_constant 
     < 
      bool, 
      BoolFunc< 
       typename StatTagFunc<stat_tag>::type, 
       StatTagArgs... 
      >::value 
     >; 
    }; 
}; 
+0

Liên kết bị hỏng và lừa dối :( – Quentin

+0

Tôi phải lấy thư viện ra khỏi github .... – rmccabe3701

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