5

Vì vậy this example từ: http://en.cppreference.com/w/cpp/utility/variant/visit tuyên bố kiểu chuyên ngành:Loại cấu trúc này được kế thừa từ là gì?

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; 
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; 

nào được xây dựng như một r có giá trị ở đây:

std::visit(overloaded { 
    [](auto arg) { std::cout << arg << ' '; }, 
    [](double arg) { std::cout << std::fixed << arg << ' '; }, 
    [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }, 
}, v); 

Tôi đang cố gắng tìm ra cách làm việc này. Loại overloaded được thừa hưởng từ đây là gì? Nó có vẻ giống như một loạt các lambdas nhưng tôi không thấy làm thế nào mà sẽ có một operator(). Ai đó có thể giải thích làm thế nào di sản đang làm việc ở đây?

+3

Nếu bạn trên 10k, bạn có thể thấy tôi vừa thử câu hỏi này: https://stackoverflow.com/q/44414238/2642059 @BaummitAugen đã giúp tôi nhận ra sự kế thừa. Vì vậy, tôi nghĩ rằng tôi đang hỏi câu hỏi đúng ngay bây giờ. –

Trả lời

6

overloaded kế thừa từ mỗi lambda riêng lẻ và mỗi lambda có một toán tử cuộc gọi. Do đó, bạn tạo một cấu trúc có tất cả toán tử cuộc gọi trong một tập quá tải. Miễn là chúng không rõ ràng, cái đúng sẽ tự động được chọn.

Bạn có thể tưởng tượng mẫu variadic mở rộng đến

struct overloaded : 
    // inherits from 
    decltype([](auto arg) { std::cout << arg << ' '; }), 
    decltype([](double arg) { std::cout << std::fixed << arg << ' '; }), 
    decltype([](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }) 

    // has three operator()s 
    { 
     using decltype([](auto arg) { std::cout << arg << ' '; })::operator(); 
     using decltype([](double arg) { std::cout << std::fixed << arg << ' '; })::operator(); 
     using decltype([](const std::string& arg) { std::cout << std::quoted(arg) << ' '; })::operator(); 
    }; 

Ngoại trừ trong mã thực nó sẽ không làm việc vì lambdas với cùng một cơ thể sẽ vẫn có các loại khác nhau.

Tạo loại 1 overloaded với nhiều lần kế thừa cho mỗi lần khởi tạo.

+0

Rõ ràng bạn hiểu chủ đề này tốt hơn tôi ... Vậy tôi có đang tạo một đối tượng 'quá tải' với nhiều thừa kế không? Hoặc có lẽ 3 đối tượng 'bị quá tải'? –

+0

@JonathanMee Bạn đang vượt qua một đối tượng có ba toán tử mà lần lượt gọi một trong ba lambdas bạn lấy được từ đó. Cuối cùng, bạn chỉ có thể tạo một loại và tự cung cấp cho các toán tử đó, đây chỉ là một cách viết tắt cho ví dụ này. –

+0

@BartekBanachewicz Điều đó dường như không phù hợp với những gì 'nwp' đang nói. Anh ấy dường như nghĩ rằng tôi đang đi qua 3 cá thể lambdas. –

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