2012-06-30 15 views
5

मैं इस सदस्य समारोह परीक्षण:SFINAE सदस्य समारोह अस्तित्व परीक्षण मुद्दा

template <typename T> 
struct has_member { 
    template <typename U> static true_type f(decltype(declval<U>().member()) *); 
    template <typename> static false_type f(...); 
    static const bool value = decltype(f<T>(0))::value; 
}; 

यह मामला समारोह एक अधिभार नहीं लेता है कि है कि में जब किसी के नाम के साथ एक सदस्य समारोह में मौजूद है सही का आकलन, तर्क। ऐसे कार्यों के लिए और एसटीएल कंटेनरों के मामले में, यह तत्वों के उपयोग कार्यों (सामने, पीछे इत्यादि) को छोड़कर ठीक से काम करता है, जहां यह हमेशा झूठे मूल्यांकन करता है।

वह क्यों है? मेरे पास g + g 4+ mingw है।

+0

पिछली वापसी प्रकार की सहायता में बदल रहा है? 'ऑटो एफ (यू * पी) -> decltype (पी-> सदस्य(), true_type());' – Xeo

उत्तर

6

ऐसा इसलिए है क्योंकि ये फ़ंक्शन संदर्भ लौटाते हैं, और आप रिटर्निंग मान पर एक पॉइंटर घोषित कर रहे हैं, जो एक संदर्भ के लिए सूचक है, और यह असंभव है।

त्वरित सुधार होगा:

template <typename U> static true_type 
     f(typename remove_reference< decltype(declval<U>().member()) >::type *); 

पुनश्च: त्रुटियों के इन प्रकार किया जा सकता है (अपेक्षाकृत) यदि आप जब SFINAE विफल रहता है एक त्रुटि देने के लिए संकलक मजबूर हल करने के लिए आसान है और आप इसे लगता है नहीं चाहिए।

मेरा मतलब है, अपने कोड में, false_type पर टिप्पणी करें और संकलक से त्रुटियों को देखें जब true_type एकमात्र विकल्प है। अर्थहीन रेखाओं के एक समूह के बीच निम्नलिखित है:

test.cpp:9:50: error: forming pointer to reference type 
    ‘__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type& {aka int&}’ 
+0

धन्यवाद, यह काम किया। मुझे लगता है कि मैंने संदर्भ को हटाने के बिना इसे करने का एक तरीका भी निकाला है: इसमें "टाइपनाम चेक = decltype (घोषणा () .front()" एक दूसरे टेम्पलेट तर्क के रूप में शामिल है, और इसके बजाय एक चार सूचक को पास करें। –

+0

@ AndrásKovács - इस तरह से भी बेहतर है। – rodrigo

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