2012-03-22 33 views
5

की अनुमति देता है मेरा मानना ​​है कि बूस्ट की मेरी समझ :: mpl :: set मूलभूत रूप से त्रुटिपूर्ण होना चाहिए। मैंने सोचा कि यह केवल अद्वितीय प्रकार की अनुमति दी।बूस्ट एमपीएल सेट क्यों गैर-अद्वितीय प्रकार

लेकिन निम्न कोड को संकलित करता है:

#include <boost/mpl/set.hpp> 
#include <boost/mpl/vector.hpp> 
#include <boost/mpl/accumulate.hpp> 
#include <boost/mpl/plus.hpp> 
#include <boost/mpl/int.hpp> 
#include <boost/mpl/placeholders.hpp> 
#include <boost/mpl/sizeof.hpp> 
#include <boost/mpl/assert.hpp> 
using namespace boost::mpl; 

typedef set<long,float,long> my_set; //long repeated in set? 
typedef vector<long,float,long> my_vec; //seems reasonable 

typedef accumulate< 
    my_set 
    , int_<0> 
    , plus<_1, sizeof_<_2>> 
    >::type set_size; 

typedef accumulate< 
    my_vec 
    , int_<0> 
    , plus<_1, sizeof_<_2>> 
    >::type vec_size; 

BOOST_MPL_ASSERT_RELATION(vec_size::value, ==, sizeof(long)+sizeof(float)+sizeof(long)); 
//why does the following line compile? 
//shouldn't the size be sizeof(long)+sizeof(float) instead? 
BOOST_MPL_ASSERT_RELATION(set_size::value, ==, sizeof(long)+sizeof(float)+sizeof(long)); 
+0

'टाइपपीफ सेट <लम्बा, फ्लोट, लम्बा> my_vec;' 'टाइपेडफ वेक्टर <लंबा, फ्लोट, लंबा> my_vec;' होना चाहिए? – Mankarse

+0

हाँ –

उत्तर

10

देखो फिर documentation पर।

किसी सेट को बनाने के लिए प्रयुक्त T1, T2, T3, ..., TN की सूची में कोई डुप्लीकेट नहीं होना चाहिए। (- अगर T1, T2, T3, ..., TN डुप्लीकेट शामिल नहीं है set<T1, T2, ..., TN> निर्माण केवल एक अच्छी तरह से परिभाषित अर्थ नहीं है या अलग ढंग से रखा है)।

दस्तावेज में Later on कैसे जो डुप्लिकेट हो सकती तत्वों की सूची से एक सेट का निर्माण करने का एक उदाहरण है:

typedef fold< 
    vector<long,float,long> 
, set0<> 
, insert<_1,_2> 
>::type s; 

BOOST_MPL_ASSERT_RELATION(size<s>::value, ==, 2); 

सेट अपरिवर्तनशीलताओं केवल लागू की गई हैं, तो आप सेट इंटरफ़ेस का उपयोग बनाने के लिए सेट।

+0

को ठीक करने के लिए धन्यवाद, एक दिलचस्प बिंदु यह है कि 'fold <...> :: प्रकार' का परिणाम 'mpl :: set' नहीं है लेकिन' boost :: mpl :: s_item कुछ ', मैं भी याद आ रही है <लंबे, :: एमपीएल :: set0 को बढ़ावा देने>। Boost.Fusion में इस 'as_set' metafunction साथ हल हो गई है (http://www.boost.org/doc/libs/1_59_0/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html) , लेकिन मैं बूस्ट एमपीएल में एक ही नहीं मिल रहा। – alfC

+0

यहाँ मिले मेरी टिप्पणी का हल: http://stackoverflow.com/questions/28585599/how-to-obtain-standard-mpl-sequence-after-fold – alfC