2014-11-12 16 views
10

Tôi đã kiểm tra việc thực hiện các clamp trong thúc đẩy:Điểm của "boost :: mpl :: identity <T> :: type" ở đây là gì?

template<typename T, typename Pred> 
    T const & clamp (T const& val, 
    typename boost::mpl::identity<T>::type const & lo, 
    typename boost::mpl::identity<T>::type const & hi, Pred p) 
    { 
// assert (!p (hi, lo)); // Can't assert p (lo, hi) b/c they might be equal 
    return p (val, lo) ? lo : p (hi, val) ? hi : val; 
    } 

Nếu tôi tìm kiếm các tài liệu, identity trả về đối số mẫu không thay đổi.

Tính chất siêu thực. Trả về X không đổi.

Vì vậy, điểm của việc sử dụng nó ở đây là gì?

Không phải là typename boost::mpl::identity<T>::type tương đương với T?

+6

vô hiệu loại khấu trừ trên các thông số này –

+0

để nó suy ra 'T' hoàn toàn dựa trên tham số đầu tiên? aaaah ... thx –

+0

vâng, đúng như bạn đã nói –

Trả lời

13

A lồng nhau tên-specifier tạo ra một ngữ cảnh không suy luận. Do đó, một trình biên dịch sẽ không cố gắng để suy ra loại T dựa trên các thông số thứ hai và thứ ba khai báo là:

typename boost::mpl::identity<T>::type const & 

Loại T sẽ được suy luận chỉ dựa vào loại đối số đầu tiên, và sau đó sử dụng để nhanh chóng các loại của các tham số còn lại. Sử dụng loại identity là một thủ thuật phổ biến để ngăn chặn việc loại trừ mẫu đối số trên các thông số nhất định, nếu không sẽ dẫn đến lỗi cuộc gọi không rõ ràng trong trường hợp các loại đối số khác nhau, nhưng sử dụng cùng một thông số mẫu kiểu. Đôi khi, bạn cũng có thể không muốn trình biên dịch tự động suy ra loại và buộc một người gọi gọi tự mình thực hiện.

+0

Có cách nào khác để đạt được kết quả tương tự không? (Bên ngoài tôi đoán viết một hàm khác và đúc 'lo' và' hi') – Barry

+1

@Barry không nghi ngờ gì, bởi vì có những cách tương tự để tạo ngữ cảnh không thể suy diễn được. Tuy nhiên, ít người sẽ thanh lịch và thành ngữ như thế này. Vậy, tại sao bạn lại muốn nó theo cách khác? (Nếu bạn không thích MPL, chỉ cần viết hàm meta của bản sắc 'identity'. Đó là tất cả ~ 6 dòng mã) – sehe

+4

+1 Một nitpick: bạn có thể muốn đề cập rằng sử dụng' :: type' lồng nhau trong một ngữ cảnh không suy luận cho phép chuyển đổi ngầm định trên 'hi' và' lo', không được xem xét trong quá trình khấu trừ đối số. Việc cho phép các kiểu tham số hỗn hợp này sẽ là ứng dụng chính ở đây. – TemplateRex

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