में संकलन-समय निरंतर मानों की static_assert स्ट्रिंगफिकेशन संकलन समय पर constexpr
या #define
डी मान के मूल्य को मुद्रित करने का कोई तरीका है? मैं std::cout <<
के बराबर, या किसी तरह की तरह कुछ करना चाहता हूँstd :: cout compile time पर समकक्ष, या C++ 11
constexpr int PI_INT = 4;
static_assert(PI_INT == 3,
const_str_join("PI_INT must be 3, not ", const_int_to_str(PI_INT)));
संपादित करें: मैं कुछ बुनियादी संकलन समय constexpr
रों साथ मुद्रण, कम से कम जीसीसी पर
template <int v>
struct display_non_zero_int_value;
template <>
struct display_non_zero_int_value<0> { static constexpr bool foo = true; };
static constexpr int v = 1;
static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");
की तरह कुछ कर रही द्वारा कर सकते हैं
जो मुझे error: incomplete type ‘display_non_zero_int_value<1>’ used in nested name specifier static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");
देता है। (Icpc, दूसरे हाथ पर, कम उपयोगी है, और सिर्फ error: incomplete type is not allowed
कहते हैं) वहाँ एक रास्ता एक मैक्रो है कि इस सामान्यीकरण करूँ ताकि तरह
constexpr int PI_INT = 4;
PRINT_VALUE(PI_INT)
कुछ करना और एक त्रुटि संदेश है कि शामिल है प्राप्त कर सकते हैं लिखने के लिए है 4, किसी भी तरह?
इसे उत्तर के रूप में पोस्ट नहीं किया जा रहा है क्योंकि मेरे पास हाथों का सबूत नहीं है, लेकिन मुझे याद है कि अतीत में ऐसा करने की कोशिश कर रहा है और मुझे लगता है कि मानक कहता है कि static_assert को एक स्ट्रिंग अक्षरना है, और इसके परिणामस्वरूप आप कर सकते हैं इसके बजाय एक constexpr अभिव्यक्ति का उपयोग नहीं करते हैं। माफ़ कीजिये। – je4d
ध्यान दें कि आपका फ़िक्स वास्तव में 'static_assert' का उपयोग नहीं कर रहा है। यह सिर्फ एक निर्माण के मूल विचार को पुनर्निर्मित कर रहा है जो पास या असफल होने के अलावा कुछ भी नहीं करता है। "प्रिंटिंग" की चीज को भी परीक्षण करना पड़ता है, इसलिए आप पूरी समस्या को SFINAE के साथ हल कर रहे हैं। – Potatoswatter