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{});
}
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 foo
và int{}
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ó.
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
@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 ... –