2010-08-30 14 views
5

मैं यह पता लगाने की कोशिश कर रहा था कि नामस्थान सदस्य अस्तित्व का परीक्षण करने के लिए sfinae का उपयोग करना संभव है या नहीं। Google इसके बारे में चुप है। मैंने निम्नलिखित कोड का प्रयास किया है, लेकिन यह विफल रहता है।नामस्थान सदस्यों के अस्तित्व का परीक्षण करने के लिए sfinae का उपयोग करें

namespace xyz{ 
struct abc{}; 
} 

struct abc{}; 

struct test_xyz{ 
typedef char yes; 
typedef struct{ char a[2]; } no; 

template <class C> static yes test(xyz::C = xyz::C()); //lets assume it has default constructor 
template <class C> static no test(...); 

const bool has_abc = sizeof(test_xyz::test<abc>()) == sizeof(yes); 
}; 

कोई विचार क्यों?

सम्मान,

उत्तर

10

नहीं, यह काम नहीं करेगा। इस तरह से SFINAE का उपयोग करने का कोई तरीका नहीं है (इस पर अंतिम सी ++ 0x घटक के खिलाफ संगतता परीक्षण के लिए यूज़नेट पर चर्चा की गई थी)। xyz::C के अंदर सी टेम्पलेट पैरामीटर से बिल्कुल संबंधित नहीं है।

याद रखें कि टेम्पलेट्स सिर्फ मैक्रोज़ नहीं हैं। पैरामीटर C न केवल पाठ का एक टुकड़ा दर्शाता है, बल्कि एक अर्थात् इकाई है। इस मामले में यह एक प्रकार है। यह पहले से ही एक तर्क के रूप में अर्थ के लिए बाध्य है। यही है, अगर आपकी कक्षा में abc नाम का सदस्य था, तो पैरामीटर का अर्थ अभी भी नहीं बदलेगा।

सब आप चाहते हैं कुछ struct xyz::abc उपयोग करने के लिए यदि वह मौजूद है, तो और others::abc अन्यथा, वहां पहुंचने के लिए कुछ चाल कर सकते हैं, लेकिन मैं एक तरीका है कि यह xyz

namespace others { 
    struct abc{}; 
} 

namespace fallbacks { 
    using others::abc; 
} 

namespace xyz { 
    using namespace fallbacks; 
} 
बिना छुए करता है के बारे में पता नहीं कर रहा हूँ

अब यदि आप कहते हैं कि xyz::abc और xyz में एक सदस्य घोषित किया गया है, तो वह उस सदस्य को संदर्भित करेगा (वह सदस्य fallbacks में एक को छुपाएगा। हालांकि यदि इसमें उस सदस्य को शामिल नहीं किया गया है, तो उपयोग निर्देश का नाम मिलेगा और fallbacks::abc देखें।

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