2011-02-08 19 views
5

क्या यह काम करने का कोई तरीका है? मुझे आशा है कि आप अनुमान लगा सकेंगे कि, मैं पुनरावर्ती जोड़े के माध्यमबढ़ावा :: संस्करण रिकर्सिव परेशानी

#include <boost/variant.hpp> 
#include <utility> 

struct nil {}; 
typedef boost::make_recursive_variant<nil, std::pair<int, boost::recursive_variant_ >>::type list_t; 

int main() { 
    list_t list = { 1, (list_t){ 2, (list_t){ 3, nil() } } }; 
    return 0; 
} 

उत्तर

4

नंबर एक बढ़ावा की बात :: संस्करण यह एक निश्चित आकार की है कि है, और नहीं है से एक सूची बनाने के लिए कोशिश कर रहा हूँ गतिशील आवंटन करें। इस तरह यह एक संघ के समान है। एक रिकर्सिव बूस्ट :: संस्करण को अपने सबसे बड़े संभावित मूल्य को शामिल करने के लिए अनंत आकार होना चाहिए - स्पष्ट रूप से असंभव।

हालांकि, आप इसे पॉइंटर के माध्यम से पास करके ऐसा कर सकते हैं। उदाहरण के लिए:

struct nil { }; 

typedef boost::make_recursive_variant<nil, 
    std::pair<int, boost::scoped_ptr<boost::recursive_variant_> > > 
     variant_list_int; 
+9

बोलने के लिए थोड़ा देर से 'नफरत लाने' के लिए खेद है, इसलिए बोलने के लिए, लेकिन मैं बस एक संबंधित प्रश्न से इसमें भाग गया। Boost.variant में पॉइंटर्स डालने की कोई आवश्यकता नहीं है - recursive_variant wrapper आंतरिक रूप से 'boost :: shared_ptr' का उपयोग करता है, इसलिए आपका 'अनंत आकार' दावा गलत है। स्टैक-आधारित योजना की गारंटी नहीं है और केवल तभी उपयोग किया जाता है जब सभी रचनाकार (टेम्पलेट पैरामीटर के लिए) में एक नोट्रो कन्स्ट्रक्टर होता है। आप इसके बारे में यहां और अधिक पढ़ सकते हैं: http://www.boost.org/doc/libs/1_46_1/doc/html/variant/design.html#variant.design.never-empty ('अस्थायी ढेर बैकअप' देखें) । – phooji

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