दुर्भाग्यवश, इस बात की कोई गारंटी नहीं है कि constexpr
फ़ंक्शन, यहां तक कि सबसे छोटा, संकलक द्वारा मूल्यांकन किया जाएगा जब तक कि पूरी तरह से आवश्यक न हो। यही है, जब तक यह उस स्थान पर प्रकट न हो जहां संकलन समय पर इसकी मान आवश्यक है, उदा। एक टेम्पलेट में। आदेश संकलक संकलन के दौरान मूल्यांकन करने के लिए लागू करने के लिए, आप कर सकते हैं निम्नलिखित:
constexpr int foo_implementation (int x) {
return x + 1;
}
#define foo(x) std::integral_constant<int, foo_implementation(x)>::value
और फिर हमेशा की तरह
के रूप में अपने कोड में
foo
का उपयोग
int f = foo(123);
इस विधि की अच्छी बात यह है कि यह संकलन समय मूल्यांकन की गारंटी देता है, और आप एक संकलन त्रुटि मिलती है अगर आप एक रन-टाइम चर foo
को पारित करेंगे: नहीं तो
int a = 2;
int f = foo(a); /* Error: invalid template argument for 'std::integral_constant',
expected compile-time constant expression */
अच्छी बात यह है कि इसे एक मैक्रो की आवश्यकता होती है, लेकिन यदि आप गारंटीकृत संकलन-समय मूल्यांकन और सुंदर कोड दोनों चाहते हैं तो यह वर्तमान में अपरिहार्य लगता है। (हालांकि मुझे गलत साबित होना अच्छा लगेगा!)
स्रोत
2015-09-24 12:16:40
आप इसे हमेशा एक फ़ंक्शन टेम्पलेट में बदल सकते हैं: 'टेम्पलेट int foo() {वापसी x + 1; } ' –
ध्यान दें कि 'कॉन्टेक्सप्र' को आंशिक रूप से यहां दिए गए सभी वाक्य रचनात्मक कामकाजों का सामना करने के लिए बुलाया गया था। – rubenvb
'#define foo (n) foo() 'मेरे लिए व्यवहार्य दिखता है। –