2012-08-11 9 views
5

यह एक सरलीकृत संस्करण है जो मैं करना चाहता हूं।मेरे पास एक constexpr फ़ंक्शन में अस्थायी चर कैसे हो सकता है?

constexpr float f(float a, float b){ 
    constexpr float temp = a+b; 
    return temp*temp*temp; 
} 

मेरे संस्करण में, ए + बी कुछ और जटिल है, इसलिए मैं इसे तीन बार काट और पेस्ट नहीं करना चाहता हूं। 3 * (ए + बी) का उपयोग वास्तविक कार्य के लिए एक समाधान समाधान भी नहीं है। मैं सिंटैक्स से संबंधित प्रश्न रखने की कोशिश कर रहा हूं, और बीजगणित नहीं। मैं इसे अपने स्वयं के कॉन्स्टेक्स फ़ंक्शन में + बी ले जाकर काम करने के लिए प्राप्त कर सकता हूं, लेकिन मैं अन्यथा बेकार कार्यों के साथ नामस्थान को प्रदूषित नहीं करना चाहता हूं।

+4

यह constexpr के बारे में # 1 सबसे प्यारी बात है। –

उत्तर

3

सी ++ 11 में इसकी अनुमति नहीं है, लेकिन अब सी ++ 14 में अनुमति है।

https://en.wikipedia.org/wiki/C%2B%2B14#Relaxed_constexpr_restrictions

+2

आपको इसे दूसरी तरफ करना चाहिए। 'एफ 2 (फ्लोट अस्थायी) {वापसी अस्थायी * temp * temp; } 'और' एफ (फ्लोट ए, फ्लोट बी) {वापसी एफ 2 (ए + बी); } '। इस तरह आप 3 कॉल से बचें। –

+0

यह constexpr से कोई फर्क नहीं पड़ता क्योंकि यह संकलक को इंगित करता है कि फ़ंक्शन के परिणामों को संकलित समय पर याद किया जा सकता है और/या मूल्यांकन किया जा सकता है। संकलक एक बार अस्थायी कॉल करेगा और मूल्य 3 बार पुन: उपयोग करेगा। ग्रैंड कुल 1 जोड़, 3 आपके रास्ते और मेरे तरीके से गुणा करता है। लेकिन, जैसा कि मैंने परिचय में कहा था, मैंने समस्या को सरल बना दिया क्योंकि सवाल बीजगणित के बारे में नहीं है। –

+2

@ जॉनक: यह संकलित कोड के लिए कोई फर्क नहीं पड़ता, लेकिन यह * मनुष्यों के लिए उस कोड को लिखने और पढ़ने के लिए मायने रखता है। इसे लिखने के लिए: कम पुनरावृत्ति = त्रुटि बनाने का कम अवसर। इसे पढ़ने के लिए: यह पता लगाना आसान है कि आपको तीन गुणा समान मूल्य मिला है। – celtschk

6

देखें आप की खोज की है के रूप में, आप चर की घोषणा नहीं कर सकते हैं, यहां तक ​​कि constexpr हैं, एक constexpr समारोह के शरीर के अंदर।

एक दूसरे अभिव्यक्ति समारोह के लिए तर्क के रूप में इसे पारित करके, एक सामान्य अभिव्यक्ति को कारगर बनाना अभी भी संभव है। उदाहरण के लिए आपने यहां दिया है:

constexpr float pow3(float c) { 
    return c*c*c; 
} 

constexpr float f(float a, float b) { 
    return pow3(a+b); 
} 
संबंधित मुद्दे