2017-10-08 16 views
7

Sau một thời gian tôi phát hiện lại một mẫu của mẫu mẫu tham số. Xem ví dụ đoạn sau:Có cách nào để suy ra các mẫu bí danh cho tham số mẫu mẫu trong khi vẫn bảo toàn thuộc tính của nó bị suy luận ngữ cảnh

template <template <class> class TT, class T> 
void foo(TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo<typer>(int{}); 
} 

Mẫu alias sẽ được chuyển cho các mẫu như một mẫu mẫu tham số và được sử dụng hơn nữa để phát hiện các thông số khác của mẫu vì nó là suy luận ngữ cảnh. Sắc đẹp, vẻ đẹp!

Tuy nhiên chỉ khi mẫu bí danh bản thân cần phải được suy luận có vẻ như các trình biên dịch được điên:

template <template <class> class> 
struct tag{}; 

template <template <class> class TT, class T> 
void foo(tag<TT>, TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo(tag<typer>{}, int{}); 
} 

[live demo]

Trình biên dịch tất nhiên là đúng như TT có thể được rút ra từ cả hai tag<TT> cũng như thông số TT<T> của fooint{} không khớp với mẫu mẫu có mẫu tham số loại. Có cách nào để duy trì ngữ cảnh khấu trừ cho T nhưng thực hiện TT ngữ cảnh không được suy luận trong TT<T> không?

P.S. Ý định của tôi là tinh khiết và đây chỉ là một câu hỏi lý thuyết không có vấn đề gì đằng sau nó.

+0

Thành thật mà nói, tôi không thể thấy bất kỳ việc sử dụng nào cho cả _beautifulne đầu tiên ss_ cũng không phải cho lần thử thứ hai. Dù sao câu hỏi là hấp dẫn, +1. – skypjack

+0

@skypjack như tôi đã nói tôi thậm chí còn không nghĩ đến những tập quán có thể, vì vậy bạn có thể ở ngay đó không phải ... –

Trả lời

2

Tôi nghĩ rằng nó sẽ được dễ dàng hơn/rõ ràng hơn để viết một cái gì đó như:

template <template <class> class TT, class T> 
void foo(tag<TT>, T, std::enable_if_t< std::is_same<T,TT<T>>::value >* = 0) 

hoặc ít hạn chế

template <template <class> class TT, class T> 
void foo_impl(tag<TT>, TT<T>){} 

template <template <class> class TT, class T> 
void foo(tag<TT> a, T b){ foo_impl<TT>(a, b); } 

như một mặt lưu ý, điều này cho thấy rằng (không bản quy phạm) lưu ý trong tiêu chuẩn tuyên bố rằng Tên mẫu bí danh không bao giờ được suy ra có phần không chính xác ...

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