2010-03-05 12 views
5

मुझे एक एमपीएल :: समान प्रक्रिया की तरह आवश्यकता है जो प्रकारों पर रिकर्सन का समर्थन करता है।सी ++ रिकर्सिव एमपीएल :: बराबर समस्या?

namespace mpl = boost::mpl; 

BOOST_MPL_ASSERT((mpl::equal< 
mpl::vector<int, char>, 
typename mpl::push_back<mpl::vector<int>, char>::type >)); // OK 

ऊपर ठीक संकलित, हालांकि अगर मैं एमपीएल में इसका इस्तेमाल :: बदलने या एमपीएल :: गुना, विजुअल स्टूडियो 2010 RC1 शिकायत।

typedef mpl::vector< 
mpl::vector<int, char>, 
mpl::vector<char, char>> type_1; 
typedef mpl::transform< 
mpl::vector< 
    mpl::vector<int>, 
    mpl::vector<char>>, 
mpl::push_back<mpl::_, char>>::type type_2; 
BOOST_MPL_ASSERT((mpl::equal<type_1, type_2>)); // FAILS 

हालांकि, ये काम ...

BOOST_MPL_ASSERT((mpl::equal< 
    typename mpl::at_c<type_1, 0>::type, 
    typename mpl::at_c<type_2, 0>::type>)); // OK 
BOOST_MPL_ASSERT((mpl::equal< 
    typename mpl::at_c<type_1, 1>::type, 
    typename mpl::at_c<type_2, 1>::type>)); // OK 

यह है कि एमपीएल :: बराबर गतिशील रूप से उत्पन्न पुनरावर्ती प्रकार पर काम नहीं करता है कि वहाँ कुछ मेरी वाक्य रचना के साथ गलत है, या है?

किसी भी सलाह की सराहना की जाएगी।

उत्तर

3

mpl::transform आपके मामले में mpl::vector<> नहीं बना है लेकिन mpl::vector2<> है। ये अलग-अलग प्रकार हैं, भले ही वे अर्थात् समकक्ष हैं। तो यदि आप लिखते हैं:

typedef mpl::vector2< 
    mpl::vector2<int, char>, mpl::vector2<char, char> 
> type_1; 

typedef mpl::transform< 
    mpl::vector<mpl::vector<int>, mpl::vector<char> > 
    , mpl::push_back<mpl::_, char> 
>::type type_2; 

BOOST_MPL_ASSERT((mpl::equal<type_1, type_2>)); 

जोर से आग नहीं लगेगी।

+0

आगामी 'सी ++ 0x' के साथ मेटाप्रोग्रामिंग के लिए चीजें कैसे आसान हो रही हैं ... इसे खोजने के लिए बधाई, मुझे लगता है कि आपने वास्तव में इसे संकलित करने का प्रयास किया है? –

+2

ठीक है, मैं पहले इस समस्या में भाग गया। लेकिन इस पर ध्यान दिए बिना, आप हमेशा mpl :: प्रिंट का उपयोग कर सकते हैं ताकि संकलक को चेतावनी उत्पन्न हो सके जो वास्तविक प्रकार के टी – hkaiser

+0

धन्यवाद देता है! मैं mpl :: प्रिंट के बारे में कभी नहीं जानता था, दस्तावेज़ों में कहीं भी नहीं है। यह एक असली lifesaver है। – kyunghoon

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