2012-08-13 26 views
10

मैंने नीचे दिए गए कोड को यह पता लगाने के लिए लिखा है कि किसी प्रकार का स्थिर सदस्य चर है या नहीं। दुर्भाग्य से, यह हमेशा वापस आ रहा है कि चर मौजूद नहीं है।अस्वीकरण का उपयोग कर स्थिर सदस्य के लिए sfinae चेक

क्या कोई मुझे बता सकता है कि मैं गलत कहां जा रहा हूं? मैं जी ++ 4.7.1 का उपयोग कर रहा हूँ।

std::is_same<bool, decltype(bar::is_baz)>::value == false 

फिर अपने SFINAE हमेशा असफल रहा था:

#include <iostream> 
#include <utility> 
#include <type_traits> 

using namespace std; 

template <class T>             
class has_is_baz               
{                 
    template<class U, 
      typename std::enable_if<std::is_same<bool, decltype(U::is_baz)>::value>::type...>      
     static std::true_type check(int);       
    template <class>             
     static std::false_type check(...);       
public:                
    static constexpr bool value = decltype(check<T>(0))::value;  
}; 

struct foo { }; 

struct bar 
{ 
    static constexpr bool is_baz = true; 
}; 

int main() 
{ 
    cout << has_is_baz<foo>::value << '\n'; 
    cout << has_is_baz<bar>::value << '\n'; 
} 

उत्तर

8

मुख्य समस्या यह है कि था। मैं फिर से लिखा है has_is_baz विशेषता और अब यह काम करता है:

#include <iostream> 
#include <utility> 
#include <type_traits> 

using namespace std; 

template <class T>             
class has_is_baz               
{  
    template<class U, class = typename std::enable_if<!std::is_member_pointer<decltype(&U::is_baz)>::value>::type> 
     static std::true_type check(int); 
    template <class> 
     static std::false_type check(...); 
public: 
    static constexpr bool value = decltype(check<T>(0))::value; 
}; 

struct foo { }; 

struct bar 
{ 
    static constexpr bool is_baz = true; 
}; 

struct not_static { 
    bool is_baz; 
}; 

int main() 
{ 
    cout << has_is_baz<foo>::value << '\n'; 
    cout << has_is_baz<bar>::value << '\n'; 
    cout << has_is_baz<not_static>::value << '\n'; 
} 

डेमो here

संपादित करें: मैंने टाइप विशेषता तय की है। जैसा कि @ लिटब ने इंगित किया था, यह स्थिर सदस्यों के साथ-साथ गैर स्थैतिक सदस्यों का पता लगा रहा था।

+0

यह स्थिर होने के लिए 'U :: is_baz' की आवश्यकता नहीं है। एक 'संरचना ए {बूल is_baz; }; 'बस काम भी करेगा। –

+0

@ जोहान्सचैब-लिटब आप सही हैं। ऐसा लगता है कि यह अब काम करता है। – mfontanini

5

अपने कोड में मुद्दा यह है कि एक constexpr वस्तु परोक्ष const है, जिसका अर्थ है कि एक ही प्रकार के लिए अपने परीक्षण होना चाहिए:

std::is_same<const bool, decltype(U::is_baz)>::value 

इस में §7.1.5 [DCL मानक में निर्दिष्ट है। constexpr]/9

किसी ऑब्जेक्ट घोषणा में उपयोग किए गए एक कॉन्टेक्सप्रेटर विनिर्देश वस्तु को कॉन्स्ट के रूप में घोषित करता है। [...]

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