2011-08-24 4 views
22

मुझे एक सी ++ 0x static_assert होना चाहिए जो परीक्षण करता है कि कोई दिया गया संरचना प्रकार POD है (अन्य प्रोग्रामर अनजाने में नए सदस्यों के साथ इसे तोड़ने से रोकने के लिए)। यानी,क्या कोई संकलन-समय func/macro यह निर्धारित करने के लिए है कि कोई C++ 0x संरचना पीओडी है या नहीं?

struct A // is a POD type 
{ 
    int x,y,z; 
} 

struct B // is not a POD type (has a nondefault ctor) 
{ 
    int x,y,z; 
    B(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {} 
} 

void CompileTimeAsserts() 
{ 
    static_assert(is_pod_type(A) , "This assert should not fire."); 
    static_assert(is_pod_type(B) , "This assert will fire and scold whoever added a ctor to the POD type."); 
} 

वहाँ is_pod_type() किसी तरह का मैक्रो या आंतरिक कि मैं यहाँ का उपयोग कर सकते है? मुझे किसी भी C++ 0x दस्तावेज़ों में कोई नहीं मिला, लेकिन निश्चित रूप से 0x पर वेब की जानकारी अभी भी खंडित है।

+1

ध्यान दें कि सी ++ 0x में, स्ट्रक्चर बी पीओडी नहीं है क्योंकि इसमें * ट्राइविअल डिफॉल्ट कन्स्ट्रक्टर * नहीं है (N3242 में 9.0.10 और 9.0.6 देखें)। मुझे यकीन नहीं है कि वास्तव में एक छोटे से डिफ़ॉल्ट कन्स्ट्रक्टर के रूप में क्या मायने रखता है (12.1.5 देखें), लेकिन संदेह है कि 'बी() = डिफ़ॉल्ट जोड़ना;' संरचना बी को सी ++ 0x पीओडी में बदल सकता है। – Sjoerd

उत्तर

26

सी ++ 0x इस प्रकार के आत्मनिरीक्षण के लिए शीर्षलेख <type_traits> में एक प्रकार की विशेषता पुस्तकालय प्रस्तुत करता है, और is_pod प्रकार विशेषता है। मुझे विश्वास है कि आप static_assert साथ संयोजन के रूप में इसका इस्तेमाल करते हैं देंगी:

static_assert(std::is_pod<A>::value, "A must be a POD type."); 

मैं इस के लिए आईएसओ मसौदा N3092 उपयोग कर रहा हूँ, इसलिए इस बात की संभावना है कि इस पुरानी हो गई है है। मैं इसे पुष्टि करने के लिए हाल के मसौदे में इसे देख लूंगा।

EDIT: हाल के मसौदे (N3242) के अनुसार यह अभी भी मान्य है। ऐसा लगता है कि ऐसा करने का तरीका है!

+0

महान काम करता है, धन्यवाद! – Crashworks

+3

ध्यान दें कि सी ++ 0x में, पीओडी परिभाषा को आराम दिया गया है और विभाजित किया गया है। तो अब भी 'std :: is_trivially_copyable <>' और 'std :: is_standard_layout <>' है (लिंक किए गए N3242 देखें)। * Trivover copyow * और * मानक लेआउट * मतलब के लिए http://stackoverflow.com/questions/6496545/trivial-vs- मानक-layout-vs-pod/6496703#6496703 देखें। – Sjoerd

+0

@ Sjoerd- लिंक के लिए धन्यवाद! मैं नहीं जानता था कि। – templatetypedef

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

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