2013-05-27 7 views
6

में उपलब्ध मैं काफी टोड Veldhuizen के metaprogramming guide में अंतिम उदाहरण देखने के लिए जहां sin और cos तरह ट्रिग कार्यों पूर्व गणना संकलन समय पर कर रहे हैं प्रभावित हुआ है। ईमानदार होने के लिए यह मुझे दूर उड़ा दिया और यदि आप कोड लिख रहे हैं जो लूप में इनकी जबरदस्त संख्या करता है, जैसा कि मैं हूं, तो इसका प्रदर्शन बढ़ने पर काफी असर हो सकता है।क्या गणित ऑपरेटरों metaprogramming

प्रश्न 1

हालांकि

, यह जहां लाइन क्या एक रन-टाइम उपकरण के रूप में उपलब्ध है के बीच तैयार की है आश्चर्य (sin या cos तरह बुला वास्तविक गणित पुस्तकालय कार्यों) और क्या रूप में उपलब्ध है मुझे नेतृत्व केवल एक संकलन समय गणितीय ऑपरेटर।

टोड के उदाहरण को साधारण अंकगणितीय का उपयोग करके ट्रिगर फ़ंक्शन की मैन्युअल रूप से गणना करने की आवश्यकता है।

मैं तो मान लेना कि एक संकलक सभी साधारण गणित कार्यों *+-/ लेकिन और कुछ नहीं करने में सक्षम है हूँ?

प्रश्न 2

इस तरह के एक मामले में, आप केवल पूर्णांकों पर sin और cos गणना के लिए संकलन समय परिणाम प्राप्त करने में सक्षम है, है ना होगा? यही है, आप sin 45.5 जैसे कुछ के परिणाम को पूर्व-संकलित नहीं कर सकते हैं, सही?

या शायद अगर टेम्पलेट केवल पैरामीटर के रूप में पूर्णांकों स्वीकार कर सकते हैं, आप कई पूर्णांकों लेने के लिए और 123 गुजर और एक नाव मूल्य की sin पाने के लिए 1.23 बनाने की तरह कक्षा में उनमें से बाहर एक float बनाने के लिए, कर सकते हैं।

उत्तर

2

प्रश्न 1

हालांकि

, यह जहां लाइन क्या एक रन-टाइम उपकरण के रूप में उपलब्ध है के बीच तैयार की है आश्चर्य है (पाप या क्योंकि जैसे वास्तविक गणित पुस्तकालय कार्यों बुला) और क्या रूप में उपलब्ध है मुझे नेतृत्व केवल एक संकलन समय गणितीय ऑपरेटर।

  • नाम कार्यों केवल compiletime पर इस्तेमाल किया जा सकता है अगर वे constexpr घोषणा की जाती है, constexpr के नियमों का पालन करना और compiletime स्थिरांक के साथ कहा जाता है।
  • उपयोगकर्ता परिभाषित डेटाटाइप का उपयोग केवल संकलन समय पर किया जा सकता है अगर वे constexpr कंपाइलटाइम स्थिरांक से रचनाकारों के माध्यम से निर्मित किए जाते हैं।
  • कोई भी बिल्टिन ऑपरेटर जो संकलन निरंतर निर्मित प्रकारों पर संचालित होता है, एक संकलन स्थिरता देता है।
  • बिल्टिन के बीच किसी भी प्रकार का रूपांतरण एक संकलन स्थिर देता है, यदि मूल संकलन स्थिर है।

इसलिए, यह चार गणितीय ऑपरेटर तक ही सीमित नहीं है, तो आप के रूप में अच्छी % और अन्य ऑपरेटरों, साथ ही टेम्पलेट metafunctions और constexpr एक्सप्रेशन का उपयोग कर सकते हैं।

प्रश्न 2

इस तरह के एक मामले में, आप केवल पाप के लिए और पूर्णांकों पर गणना क्योंकि संकलन समय परिणाम प्राप्त करने में सक्षम है, है ना होगा? यही है, आप पाप 45.5 जैसे कुछ के परिणाम को पूर्व-संकलित नहीं कर सकते, सही?

हां और नहीं। सी ++ 03 में आप बिल्टिन और टेम्पलेट मेटाफंक्शन तक सीमित हैं, constexpr उपलब्ध नहीं है। इसलिए sin इसलिए एक टेम्पलेट मेटाफंक्शन होना चाहिए जो केवल अभिन्न स्थिरांक पर काम कर सकता है, क्योंकि टेम्पलेट्स में फ़्लोटिंग पॉइंट प्रकारों की अनुमति नहीं है। हालांकि आप भिन्नताओं या निश्चित बिंदु मानों के लिए टेम्पलेट को परिभाषित कर सकते हैं और उन लोगों के लिए sin टेम्पलेट के साथ आ सकते हैं। हालांकि यह बहुत कठिन होगा और आप टेम्पलेट तत्काल सीमाओं में आसानी से चल सकते हैं।

सी ++ 11 के बाद से आप constexpr फ़ंक्शन लिख सकते हैं जो फ़्लोटिंग पॉइंट पैरामीटर लेते हैं और उनसे काम करते हैं।

+1

श्रृंखला विस्तार के साथ संकलन समय में साइन कंप्यूटिंग के लिए http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html देखें – jmihalicza