Boost assert.hpp फ़ाइल में P :: ************ का क्या अर्थ है?


80

में बढ़ावा / एमपीएल / assert.hpp , मैं कुछ इस तरह देखा:

template<class Pred>
struct eval_assert {
    typedef typename extract_assert_pred<Pred>::type P;
    typedef typename P::type p_type;
    typedef typename ::boost::mpl::if_c<p_type::value,
        AUX778076_ASSERT_ARG(assert<false>),
        failed ************ P::************
    >::type type;
};

यदि पहले ************संरचना के संकेत के रूप में इलाज किया जा सकता है, P::************वास्तव में मेरे लिए कोई मतलब नहीं है। क्या यह मानक C ++ है?



5
उत्पादन कोड में @deviantfan? आपको आश्चर्य होगा। ;) लेकिन यहाँ बिंदु एक संकलन विफलता का कारण Pहै जो कि मौजूद नहीं है की एक बहुत ही उच्च डिग्री के साथ एक सदस्य को संदर्भित करने की कोशिश कर रहा है। (C ++ 11 में आप शायद static_assert(false)इसके बजाय उपयोग करेंगे , लेकिन निश्चित रूप से बूस्ट को प्री-सी ++ 11 से पोर्टेबल होना चाहिए।)
cdhowie

4
साइड नोट: 12-स्तरीय पॉइंटर का संभवतः सी मानक द्वारा आवश्यक न्यूनतम के साथ कुछ करना है।
टीसी

29
@PaulDraper यह वास्तव में hunter2hunter2hunter2hunter2यहाँ पढ़ रहा है
seh

5
P टाइप के एक सदस्य के लिए एक एक सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक के लिए सूचक को सूचक को सूचक
काई

जवाबों:


100

इस कोड का बिंदु संकलक को "दृश्यमान" त्रुटि संदेश बनाने में मदद करना है।

पूर्व static_assertयुग में, एक टेम्प्लेट-हैवी कोड का संकलन आसानी से ~ 100 लाइनों के त्रुटि संदेशों को भी एक गलती के लिए पैदा कर सकता था, और उन लाइनों के 99% अक्सर अर्थहीन होते हैं।

उदाहरण के लिए वास्तविक त्रुटि को इंगित करने के लिए 10 पॉइंटर्स ट्रिक उपयोगी है:

 BOOST_STATIC_ASSERT((std::is_same<T,U>));

के साथ T=void*और U=char*संकलित के साथ संकलित ~ 10 त्रुटि लाइनों का उत्पादन, लेकिन आप आसानी से प्रासंगिक देख सकते हैं:

error: no matching function for call to ‘assertion_failed(mpl_::failed************ std::is_same<void*, char*>::************)’

45

यह एक पॉइंटर-टू-पॉइंटर-टू -..- प्रकार Pका सदस्य है, जहाँ सदस्य टाइप पॉइंटर-टू-पॉइंटर-टू -..- का डेटा सदस्य है failed

इस मामले में लक्ष्य बस इतना है Pकि यह मौजूद नहीं होगा संभावना के एक बहुत ही उच्च डिग्री के साथ एक सदस्य का उल्लेख करके असफलता का कारण बनता है। C ++ 11 में आप static_assertइसके बजाय उपयोग करेंगे , लेकिन निश्चित रूप से Boost को C-11 ++ के पूर्व बोलियों के लिए पोर्टेबल होना चाहिए।


19

F P::*एक "सूचक Pप्रकार का सदस्य है F"।

F P::**Pप्रकार के सदस्य के लिए "सूचक को सूचक F" है।

अधिक *एस सामने में अधिक "पॉइंटर" जोड़ता है।

इस मामले Fमें failed ************, अर्थात्, "पॉइंटर टू पॉइंटर टू ... पॉइंटर टू failed" है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.