macros - How do you make C++ create an expression that uses compile-time checking for constants and asserts for variables? -


यहाँ एक उदाहरण सेटअप है ... एक मैक्रो या एक टेम्प्लेट CHECKEXPR_RETURNVAL (EXPR, VAL) यह जांचता है कि वैल वापस करते समय EXPR TRUE है।

यह विभिन्न स्थानों में उपयोगी है - जैसे कि यह बहुत ही आसान उदाहरण:

  #depine ISPOW2 (वैल) ((0! = VAL) & amp; amp; ; (0 == (वैल एंड (वैल-1))) # परिभाषित _ALIGNPOW2 (वैल, एल्गिन) ((वैल + (ALIGN-1)) & amp; (~ (ALIGN-1))) #define ALIGNPOW2 (वैल, ALIGN) CHECKEXPR_RETURNVAL (\ ISPOW2 (ALIGN), _ALIGNPOW2 (VAL, ALIGN))  

तो, यह कठिनाई है: यदि संभव हो तो मैं समय जांच को संकलित करना चाहता हूं, और यदि मूल्य स्थिर नहीं है जो संकलन समय पर निर्धारित होता है, फिर एक रनटाइम चेक होता है।

असल में, यह विचार है कि जितनी जल्दी हो सके खराब पैरामीटर को पकड़ना; यदि आप समय के संकलन पर एक खराब पैरामीटर पकड़ सकते हैं जो रन टाइम पर खोजने से बेहतर है। इसके अलावा, संकलित समय संस्करण को लगातार प्रारंभिक रूपों के लिए जरूरी है।


यहां कई जगहों पर एकल संस्करण का काम करने के लिए मेरे दो (असफल) प्रयास हैं (एक निरंतर सरणी आकार के रूप में, एक enum initializer के रूप में, और चर के साथ एक समारोह में)। दुर्भाग्य से, वे या तो केवल संकलित समय (निरंतर प्रारंभकर्ता) या केवल रनटाइम के लिए काम करते हैं - मैं एक संस्करण का पता लगाना चाहूंगा जो दोनों के लिए काम करेगा।

  // CHECKEXPR_RETURNVAL - संस्करण " ए "# परिभाषित CTCHECK_EXPR (EXP) (CTCheckBool & lt; EXP & gt; :: ExistsZeroIfTrue) टेम्पलेट & lt; bool bExpression & gt; Struct CTCheckBool {}; टेम्पलेट & lt; & gt; स्ट्रेट CTCheckBool & lt; true & gt; {{Enum ExistsZeroIfTrue = 0};}; // नोट: प्लस ("+") कॉमा ऑपरेटर के बजाय प्रयोग किया जाता है क्योंकि // निरंतर प्रारंभिकताओं के लिए अल्पविराम ऑपरेटर का उपयोग नहीं किया जा सकता #define CHECKEXPR_RETURNVAL_A (EXP, VAL) (CTCHECK_EXPR (EXP) + (VAL)) // टेस्ट आउट संस्करण "ए" - समयबद्ध संकलन #define ALIGNPOW2_A (VAL, ALIGN) CHECKEXPR_RETURNVAL_A (\ ISPOW2 (ALIGN), _ALIGNPOW2 (VAL, ALIGN)) चार संरेखित वर्ाए [ALIGNPOW2_A (2,8)]; Enum {alignedVal_A = ALIGNPOW2_A (57,16)}; Int TestAlignPow2_A (int val, int align) {रिटर्न (ALIGNPOW2_A (val, align))}} / संकलन त्रुटि // CHECKEXPR_RETURNVAL - संस्करण "बी" टेम्पलेट & lt; typename T & gt; टी CHECKEXPR_RETURNVAL_B (बूल बीएक्सप्र, टी वाल) {एसरेट (बीएक्सएप्र); वापसी (वैल); } // टेस्ट आउट संस्करण 'बी' - केवल काम करता है रनटाइम परिकलित #define ALIGNPOW2_B (VAL, संरेखित करें) CHECKEXPR_RETURNVAL_B (\ ISPOW2 (संरेखित), _ALIGNPOW2 (VAL, संरेखित करें)) चार AlignedVar_B मूल्यों के लिए [ALIGNPOW2_B (2,8)] ; // संकलन त्रुटि enum {AlignedVal_B = ALIGNPOW2_B (57,16)}; // संकलित करें त्रुटि पूर्णांक TestAlignPow2_B (int वैल, पूर्णांक संरेखित) {वापसी (ALIGNPOW2_B (वैल, संरेखित));}  

दुर्भाग्य से, न संस्करण तीनों मामलों के लिए काम करता है। वहाँ एक कोड संरचना है कि सभी मामलों के लिए काम करेंगे है?

ऐसा लगता है कि तुम सच में उपयोग करना चाहते हैं सी ++ 0x constexpr फ़ंक्शन ...


Comments

Popular posts from this blog

Eclipse CDT variable colors in editor -

AJAX doesn't send POST query -

wpf - Custom Message Box Advice -