2012-05-24 11 views
7

तो मेरे पास एक टेम्पलेट क्लास है जिसे मैं एक std :: मानचित्र स्वीकार करना चाहता हूं जहां डेटा प्रकार या तो कच्चे सूचक या std :: unique_ptr है। तो फिर इस वर्ग में मैं अंतर्निहित सूचक के प्रकार प्राप्त करना चाहते हैं:टेम्पलेट मेटाप्रोग्रामिंग मूल्यांकन

typedef typename boost::mpl::if_< 
    boost::is_pointer<typename Container::mapped_type>, 
    typename Container::mapped_type, 
    typename Container::mapped_type::element_type* 
>::type data_type 

जब कक्षा एक कच्चे सूचक प्रकार के साथ एक मानचित्र का उपयोग instantiating हालांकि मैं निम्नलिखित त्रुटि मिलती है:

error: 'std::map<int, ValueType*>::mapped_type {aka ValueType*}' is not a class, struct, or union type 

यह मुझे लगता है कि यह कच्चे सूचक पर typename Container::mapped_type::element_type* का मूल्यांकन कर रहा है, मैंने सोचा था कि टेम्पलेट मेटाप्रोग्रामिंग के साथ यह मूल्यांकन नहीं करेगा कि जब if_ सफल हुआ। क्या मुझे इस बारे में एक अलग तरीके से जाना चाहिए?

उत्तर

11

आप की जरूरत है एक आलसीifboost::mpl::if_ के बजाय कोशिश boost::mpl::eval_if:

#include <boost/type_traits/is_pointer.hpp> 
#include <boost/mpl/eval_if.hpp> 
#include <boost/mpl/identity.hpp> 

template<typename T> 
struct extract_element_type 
{ 
    typedef typename T::element_type* type; 
}; 

template<typename Container> 
struct foo 
{ 
    typedef typename boost::mpl::eval_if< 
     boost::is_pointer<typename Container::mapped_type>, 
     boost::mpl::identity<typename Container::mapped_type>, 
     extract_element_type<typename Container::mapped_type> 
    >::type data_type; 
}; 

अर्थात, और जब संदेह में, अविवेक की एक अतिरिक्त परत जोड़।

+1

धन्यवाद! यह समझ में आता है, आलसी अगर समझ में आता है लेकिन मुझे वास्तव में समझ में नहीं आता है कि आपको पहचान और extract_element_type क्यों चाहिए? – grivescorbett

+1

@grivescorbett: 'if_' की तरह सीधे प्रकारों की बजाय,' eval_if' असामान्य मेटाफंक्शन जो _produce_ प्रकार लेता है। उस आलसी मूल्यांकन/तत्काल मेटाफंक्शन की तत्कालता यह है कि आपको जिस तरीके से आवश्यकता है, वह काम करता है। – ildjarn

+1

आह, यह मेरी पहली बार एमपीएल का उपयोग कर रहा है, जो जानता था कि यह इतना गड़बड़ हो सकता है? – grivescorbett

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