2010-10-14 10 views
5

के रूप में काम नहीं कर रहा है मैंने हाल ही में एंड्री अलेक्जेंड्रेसकू द्वारा आधुनिक सी ++ डिज़ाइन पढ़ना शुरू कर दिया है। संकलन समय इस प्रकार के दावे पढ़ने के बाद, मैं निम्नलिखित कोड की कोशिश की:मॉडर्न सी ++ डिज़ाइन से संकलितटाइम चेकर

 
template<bool> struct CompileTimeChecker 
{ 
    CompileTimeChecker(...){}; 
}; 
template<> struct CompileTimeChecker<false>{}; 

#define STATIC_CHECK(expr, msg) \ 
{\ 
    class ERROR_##msg{}; \ 
    (void)sizeof(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ } 


int main() 
{ 
    STATIC_CHECK(sizeof(char)>sizeof(int),TypeTooNarrow); /*Line 2*/ 

    STATIC_CHECK(sizeof(char)<sizeof(int),TypeTooNarrow); /*Line 3*/ 
} 

कोड लाइन 2 की वजह से संकलन नहीं करना चाहिए, लेकिन यह ठीक संकलित करता है। यह उम्मीद के रूप में काम करता है अगर मैं

 
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ } 

या

 
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ } 

को पंक्ति 1 बदल जाते हैं। मुझे यह नहीं मिला।

+0

सटीक डुप्लिकेट (एक ही उपयोगकर्ता): [आधुनिक सी ++ डिज़ाइन से संकलितटाइम चेकर अपेक्षित काम नहीं कर रहा है।] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as - अपेक्षित) –

+0

डुप्लिकेट के रूप में दूसरे को बंद करें। इसे खोलने दो। –

+0

@ पॉल आर: मुझे लगता है कि @ सौरभ ने दो बार एक ही सवाल पोस्ट किया (गलती से मुझे लगता है), दूसरा इसे पहले से ही एक डुप्लिकेट के रूप में बंद कर दिया गया है और अब आप इसे एक दूसरे के डुप्ली के रूप में देखते हुए बंद कर रहे हैं। –

उत्तर

2

Loki library से updated version आज़माएं।

+0

@ निकोलई: यह काम करता है। उस कोड में, (शून्य) त्रुटि की आवश्यकता क्या है _ ## msg; –

+0

वह दूसरा कथन है, मैं अनुमान लगा रहा हूं, इसलिए संकलक अप्रयुक्त चर के बारे में शिकायत नहीं करता है। –

+0

ठीक है। और क्या आपके पास वास्तव में पूछे गए प्रश्न पर कुछ भी है? –

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