2012-09-07 13 views
23

मैं सी ++ 11 मानक संकलन समय तर्कसंगत गणित करने की अनुमति देता है कि से वर्ग std::ratio<> देख रहा था।पीछे std :: अनुपात डिजाइन सिद्धांत <>

मैं टेम्पलेट डिजाइन और संचालन कक्षाएं बहुत जटिल के साथ लागू पाया जाता है और किसी भी कारण है कि वे सिर्फ एक बहुत आसान तर्कसंगत वर्ग को लागू करने और ऑपरेटरों के लिए constexpr कार्यों को परिभाषित करते हुए एक और अधिक सरल और सहज ज्ञान युक्त दृष्टिकोण का उपयोग नहीं कर सकता है नहीं मिला। परिणाम एक वर्ग का उपयोग करना आसान होता और संकलन-समय के फायदे बने रहे होते।

क्या किसी को constexpr का उपयोग कर एक सरल वर्ग कार्यान्वयन की तुलना में वर्तमान std::ratio<> डिज़ाइन के फायदे का कोई विचार है? असल में, मैं वर्तमान कार्यान्वयन के लिए कोई फायदा नहीं ढूंढ सकता।

+4

http://www.joelonsoftware.com/articles/fog0000000018.html –

+0

यह संकलन समय क्रम बनाम (इस प्रकार टेम्पलेट्स) नहीं है? – Drakosha

+4

@ ड्राकोशा: 'कॉन्स्टेक्सप्र' संकेत नहीं है; कुछ संदर्भों में (जहां निरंतर अभिव्यक्ति की आवश्यकता होती है), एक कंपाइलर * को संकलित समय पर निष्पादित करना होगा। –

उत्तर

36

जब N2661 प्रस्तावित किया गया था, प्रस्ताव लेखकों में से कोई भी एक संकलक जो constexpr कार्यान्वित करने के लिए उपयोग किया था। और हम में से कोई भी ऐसा कुछ प्रस्तावित करने के लिए तैयार नहीं था जिसे हम निर्माण और परीक्षण नहीं कर सके। तो constexpr के साथ बेहतर डिजाइन किया जा सकता था या नहीं, डिजाइन के विचार पर भी हिस्सा नहीं था। डिजाइन उस समय लेखकों के लिए उपलब्ध उन औजारों पर आधारित था।

+0

बेशक आप ऐसे व्यावहारिक उत्तर के साथ आएंगे। : -] – ildjarn

+4

@ jon34yp: दिलचस्प है कि यह पता चला है प्रश्नकर्ता दो सवाल पूछा गया है: 'पीछे std :: ratio' डिजाइन सिद्धांतों (1) क्या थे, जो इस विषय पर मुझे लगता है कि हावर्ड एक प्राधिकरण है। (2) वर्तमान डिजाइन है, जो उत्तर जिनमें से हावर्ड अनजान है के सभी प्रकार के हो सकता था के फायदे क्या हैं, यह कभी नहीं :-) –

0

std::ratio और उसके आसपास के तंत्र हमेशा संकलन-समय पर चलेगा, टेम्पलेट metaprogramming के आधार पर और हेरफेर टाइप करें। constexpr केवल रनटाइम पर चलने की आवश्यकता है जब सी ++ सुविधाओं (जैसे टेम्पलेट पैरामीटर) या constexpr वैरिएबल प्रारंभ करना आवश्यक है।

तो जो आपके लिए ज़्यादा ज़रूरी है: संकलन समय निष्पादन, या जा रहा है "और अधिक सरल और सहज ज्ञान युक्त"?

+3

'constexpr' के साथ, हम निरंतर अभिव्यक्तियों के लिए अंतर्ज्ञानी उपयोग और संकलन-समय निष्पादन दोनों हो सकते हैं, इसलिए टेम्पलेट्स की तुलना में सटीक समान अभिव्यक्तियों के साथ। तो एक बार में दोनों फायदे एक निष्पक्ष व्यापार के बहुत अधिक लगता है। – Morwenn

+2

@Morwenn: बिंदु निकोल बनाने के लिए कोशिश कर रहा है कि यदि आप एक स्थिति है जहाँ यह आवश्यक नहीं है में एक 'constexpr' का उपयोग (जैसे कि एक समारोह के अंदर एक नियमित अभिव्यक्ति)' constexpr' या संकलन समय पर मूल्यांकन नहीं किया जा सकता है सकते हैं, यानी यह रनटाइम पर फ़ंक्शन कॉल ट्रिगर कर सकता है। यह भी ध्यान रखें कि 'constexpr'' फ़ंक्शन केवल भाषा के उप-समूह का उपयोग कर सकते हैं, इसलिए हो सकता है कि वे इस तरह के प्राकृतिक डिज़ाइन को वैसे भी न दें। –

+3

@ दाऊद: यदि आप कुछ अन्य संदर्भ में एक 'constexpr' समारोह मजबूर कर सकते हैं संकलन समय पर मूल्यांकन किया जाना,' टेम्पलेट की तरह चालें का उपयोग कर struct compile_time_dammit {{enum मूल्य = एन}; }; ... compile_time_dammit :: मान; '। जो सब के सब विवादास्पद है, क्योंकि सवाल का जवाब पेशेवरों और :-) –

13

constexpr समाधान पूरी तरह से अलग समस्या का हल। std::ratio को विभिन्न इकाइयों का उपयोग करने वाले चर के बीच एक पुल के रूप में उपयोग करने के लिए बनाया गया था, न कि गणितीय उपकरण के रूप में। इन परिस्थितियों में, आप बिल्कुल जरूरी रूप से अनुपात का हिस्सा बनना चाहते हैं। कॉन्स्टेक्स समाधान वहां काम नहीं करेगा। उदाहरण के लिए, यह एक क्रम अंतरिक्ष और रनटाइम लागत के बिना std::duration लागू करने के लिए है, क्योंकि प्रत्येक अवधि वस्तु वस्तु के भीतर अपनी नामजद करने/भाजक जानकारी ले जाने के लिए की आवश्यकता होगी संभव नहीं होगा।

+0

डिट्टो एक उचित पुस्तकालय के लिए जहाँ आप विभिन्न आयामों की आंशिक शक्तियों चाहेगा माना जाता रहा है लेकिन आप ए) लगभग तीन या पांच वास्तविक अंशों को लेना नहीं चाहते हैं और बी) आप dist + समय को एक कंपाइलर प्रकार त्रुटि होने के लिए रनटाइम त्रुटि नहीं चाहते हैं। – emsr