5

तो this example से: http://en.cppreference.com/w/cpp/utility/variant/visit विशेष प्रकार वाणी:इस स्ट्रक्चर का प्रकार किस प्रकार से है?

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

कौन सा एक आर-मूल्य यहाँ के रूप में निर्माण किया है:

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); 

मैं यह पता लगाने की यह कैसे काम करता कोशिश कर रहा हूँ। overloaded किस प्रकार से विरासत प्राप्त करता है? यह लैम्ब्डा की एक सरणी की तरह लगता है लेकिन मुझे नहीं लगता कि उसके पास operator() होगा। क्या कोई समझा सकता है कि विरासत यहां कैसे काम कर रही है?

+3

यदि आप 10k से अधिक हैं तो आप देख सकते हैं कि मैंने अभी इस प्रश्न की कोशिश की है: https://stackoverflow.com/q/44414238/2642059 @BamititAugen ने मुझे विरासत को पहचानने में मदद की। तो मुझे लगता है कि मैं अभी सही सवाल पूछ रहा हूं। –

उत्तर

6

overloaded व्यक्तिगत रूप से प्रत्येक लैम्ब्डा से विरासत में मिलता है और प्रत्येक लैम्ब्डा में कॉल ऑपरेटर होता है। इसलिए आप एक स्ट्रक्चर बनाते हैं जिसमें सभी कॉल ऑपरेटर एक ओवरलोड सेट में होते हैं। जब तक वे संदिग्ध नहीं होते हैं तब तक सही व्यक्ति को चुना जाएगा।

आप कल्पना को छोड़कर वास्तविक कोड में यह काम नहीं करती क्योंकि समान शरीर के साथ lambdas अभी भी विभिन्न प्रकार के लिए होता है

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(); 
    }; 

का विस्तार करने के variadic टेम्पलेट कर सकते हैं।

यह 1 overloaded प्रकार प्रति तत्काल विरासत के साथ कई विरासत बनाता है।

+0

स्पष्ट रूप से आप इस विषय को मुझसे बेहतर समझते हैं ... तो क्या मैं एकाधिक विरासत के साथ एक 'ओवरलोडेड' ऑब्जेक्ट बना रहा हूं? या शायद 3 'ओवरलोडेड' ऑब्जेक्ट्स? –

+0

@ जोनाथनमी आप एक ऑब्जेक्ट पास कर रहे हैं जिसमें तीन ऑपरेटर हैं जो बदले में आप से प्राप्त तीन लैम्ब्स में से एक को कॉल करते हैं। अंत में, आप केवल एक प्रकार का निर्माण कर सकते हैं और उन ऑपरेटरों को स्वयं प्रदान कर सकते हैं, यह उदाहरण के लिए सिर्फ एक लघुरूप है। –

+0

@ BartekBanachewicz यह 'nwp' कह रहा है के साथ संरेखित प्रतीत नहीं होता है। ऐसा लगता है कि मैं 3 व्यक्तिगत भेड़-बकरियों को पार कर रहा हूं। –

संबंधित मुद्दे