2011-10-20 24 views
5

Tôi có một câu hỏi liên quan đến lựa chọn hạng ruồi, đưa ra định nghĩa dưới đây, dựa trên http://www.boost.org/doc/libs/1_40_0/libs/flyweight/test/test_basic.cppBoost.flyweight và Boost.MPL

typedef boost::flyweights::flyweight< 
    std::string, 
    boost::flyweights::tag<int>, 
    boost::flyweights::static_holder_class<boost::mpl::_1>,   
    boost::flyweights::hashed_factory_class< 
     boost::mpl::_1, 
     boost::mpl::_2, 
     boost::hash<boost::mpl::_2>, 
     std::equal_to<boost::mpl::_2>, 
     std::allocator<boost::mpl::_1> 
    >, 
    boost::flyweights::simple_locking, 
    boost::flyweights::refcounted 
> StringFlyweight; 

StringFlyweight test1("Hello World"); 

những gì giá trị có boost::mpl::_1boost::mpl::_2? Khi được sắp xếp?

boost::mpl::_1 nhiều khả năng là std::string. boost::mpl::_2 phải là size_t? Nếu đúng, làm thế nào được khấu trừ? Tôi không hiểu cách chọn key_type.

Tôi đã đọc http://www.boost.org/doc/libs/1_41_0/libs/flyweight/doc/tutorial/lambda_expressions.html nhưng tôi nó là tiếp xúc đầu tiên của tôi với Boost.MPL và không đủ :)

Trả lời

4

boost::mpl::_1boost::mpl::_2 là placeholders; chúng có thể được sử dụng làm tham số mẫu để khác nhau ràng buộc với đối số thực tế sau này. Với điều này, bạn có thể thực hiện một phần ứng dụng (chuyển đổi một hàm có một n-arity thành một hàm có một (nm) -arity), các biểu thức lambda (tạo một metafunction on-the-fly khi cần), v.v.

Biểu thức có chứa ít nhất một trình giữ chỗ là một biểu thức trình giữ chỗ, có thể được gọi như bất kỳ metafunction nào khác, với một số đối số sẽ thay thế trình giữ chỗ.

Trong ví dụ của bạn, giả sử như sau typedef

typedef boost::flyweights::hashed_factory_class< 
    boost::mpl::_1, 
    boost::mpl::_2, 
    boost::hash<boost::mpl::_2>, 
    std::equal_to<boost::mpl::_2>, 
    std::allocator<boost::mpl::_1> 
> hashed_factory; 

chúng ta có thể giả định rằng ở một thời điểm nào khác trong mã, hashed_factory sẽ được gọi bằng một số tham số:

typedef typename 
    boost::mpl::apply< 
     hashed_factory, 
     X, 
     Y 
    >::type result; // invoke hashed_factory with X and Y 
        // _1 is "replaced" by X, _2 by Y 

tôi không nhìn vào mã Flyweight, nhưng chúng ta có thể giả sử rằng _1 sẽ bị ràng buộc với kiểu giá trị của trọng số và _2 đối với loại khóa (vì nó được sử dụng cho băm và thử nghiệm bình đẳng). Trong trường hợp này, tôi nghĩ cả hai sẽ là std::string vì không có loại khóa nào được chỉ định.

Tôi không chắc chắn giải thích của mình về trình giữ chỗ của MPL là khá rõ ràng, vui lòng đọc số excellent MPL tutorial giải thích rất tốt các hàm, biểu thức lambda và các tính năng lập trình meta mẫu khác.

+0

vì vậy, key_type được xác định bằng trọng lượng. Nhưng làm thế nào tôi có thể xác định loại và cuối cùng đặt một? Điều quan trọng là chìa khóa là một loại không thể thiếu, không phải là một chuỗi. – vlg789

+0

Nếu bạn muốn chỉ định khóa được sử dụng để truy xuất đối tượng, bạn cần sử dụng 'key_value ' làm đối số cho 'flyweight '. Bạn cũng cần nói cho thư viện biết cách lấy một khóa từ một giá trị, sử dụng một "trình trích xuất khóa", một hàm trả về khóa tương ứng với giá trị được đưa ra làm đối số. Xem [hướng dẫn Boost.Flyweight] (http://www.boost.org/doc/libs/1_47_0/libs/flyweight/doc/tutorial/key_value.html) để biết ví dụ. –