2015-06-03 15 views
6

Tôi đang tự hỏi, lý do đằng sau giới thiệu std::bool_constant và việc sử dụng nó sau này cho std::true_typestd::false_type (cũng như các cấu trúc so sánh quy định tại tiêu đề <ratio>, xem N4389) trong C++ 17 là gì ?Lý do đằng sau std :: bool_constant

Như vậy đến nay tôi đã chỉ có thể xác định vị trí các giấy tờ có chứa các từ ngữ:

Trong khi cả hai giấy đề cập đến một "lý do" - https://issues.isocpp.org/show_bug.cgi?id=51 - - nguồn cấp dữ liệu nhận xét được liên kết chủ yếu nói rằng đây là "Dựa trên thảo luận về C++ std-lib *" (có lẽ là đề cập đến phản xạ riêng tư) mà không đi sâu vào chi tiết.

Đây là tài liệu: http://en.cppreference.com/w/cpp/types/integral_constant

+1

SFINAE? –

+0

Từ khóa đầu tiên của tôi nữa. Đọc về SFINAE, điều này có thể hữu ích. – MatthewRock

+1

@LightnessRacesinOrbit SFINAE phải làm gì với nó? –

Trả lời

16

Đó là tinh khiết đường cú pháp. Thông thường, chúng tôi sử dụng ví dụ: tag-dispatching như vậy:

void foo_impl(std::false_type) { /*Implementation for stuff (and char) */} 
void foo_impl(std::true_type) { /*Implementation for integers but not char*/} 

template <typename T> 
void foo(T) { 
    foo_impl(t, std::bool_constant<std::is_integral<T>{} && !std::is_same<char, T>{}>()); 
} 

Without bool_constant, chúng ta sẽ phải sử dụng một loại-specifier còn để chỉ định kiểu như mong muốn: std::integral_constant<bool, ...>. Kể từ khi sử dụng integral_constant cho các giá trị boolean bật lên đặc biệt thường xuyên, một cách ngắn gọn và ngắn gọn của địa chỉ chuyên môn đã được yêu cầu, và bool_constant cung cấp điều đó.
Trong thực tế, bool_constant là gì khác hơn là một mẫu bí danh cho bool -specializations của integral_constant:

template <bool B> 
using bool_constant = integral_constant<bool, B>; 

Lý do duy nhất tờ khai cho true_typefalse_type (và sử dụng khác của integral_constant<bool, ..>) được thay đổi là cho ngắn gọn trong tiêu chuẩn, thậm chí; Không có nhu cầu kỹ thuật, như integral_constant<bool, false>bool_constant<false> chỉ định cùng loại chính xác.

+1

Bất cứ khi nào tôi liên tục sử dụng 'std :: integral_constant' tôi kết thúc viết bí danh giống như nó; đó là một đối số cho. OTOH, tôi sử dụng 'bool_t' thay vì cái gì đó dài. Brevity là cái gì đó. – Yakk

+0

Cảm ơn bạn đã trả lời! Và, vâng, tôi đã sử dụng 'std :: integral_constant', vì vậy câu hỏi có một ẩn" như trái ngược với chỉ sử dụng phần 'std :: integral_constant ' như trước đây, mà bạn cũng đã trả lời: Cú pháp đường & conciseness có ý nghĩa :-) – Matt

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