2016-11-28 12 views
7

Nói rằng tôi có một khái niệm:Làm thế nào để lấy kiểu từ khái niệm?

template < typename Group > concept bool GGroup = 
    requires() { typename Group::Inner; }; 

Làm thế nào tôi có thể lấy loại Inner khi sử dụng các khái niệm dưới hình thức ngắn?

void doSomething(const GGroup& group) 
{ 
    // an ugly alternative 
    using Inner = typename std::decay_t<decltype(group)>::Inner; 

    //// could be something like: 
    // using Inner = GGroup::Inner; 
    // or 
    // using Inner = underlyingtype(GGroup)::Inner; 
} 
+1

Điều gì về việc sử dụng biểu mẫu dài: 'template void doSomething (const Group & group) {... Group :: Inner ...}'? – ach

+0

@AndreyChernyakhovskiy Có, nhưng vấn đề là làm điều đó ở dạng ngắn hơn. – Vahagn

+4

Sau đó, bạn đánh bại mục đích của riêng bạn. Bạn không thể sử dụng biểu mẫu ngắn (điểm chính là loại trừ tham chiếu không cần thiết đối với loại thực tế) và tham khảo loại thực tế cùng một lúc. Đối với các nhà thiết kế ngôn ngữ, một cái gì đó như 'GGroup :: Inner' không phải là một lựa chọn vì nó sẽ không rõ ràng. Hãy xem xét: nếu bạn có 'void doSomething (const GGroup & group1, const GGroup & group2)' nó sẽ tương đương với 'template void doSomething (const Group1 & group1, const Group2 & group2)'. 'GGroup' nào sau đó sẽ đề cập đến? – ach

Trả lời

3

Nhược điểm tích hợp của dạng khái niệm ngắn TS là bạn không thể chỉ đặt tên kiểu của tham số được khái niệm hóa. Bạn phải sử dụng decltype để tải xuống.

Vì vậy, bạn có sự cân bằng: bạn có thể tránh tuyên bố rõ ràng template với chi phí decltype trong mã thực của bạn hoặc bạn có thể tránh bị decltype với chi phí khai báo mẫu rõ ràng.

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