2010-06-01 8 views
7

क्या कोई मैक्रो है जो मुझे बताता है कि मेरा कंपाइलर विविध टेम्पलेट का समर्थन करता है या नहीं?मैं वैचारिक टेम्पलेट को सशर्त रूप से कैसे संकलित करूं?

#ifdef VARIADIC_TEMPLATES_AVAILABLE 

template<typename... Args> void coolstuff(Args&&... args); 

#else 

??? 

#endif 

यदि वे समर्थित नहीं हैं, तो मुझे लगता है कि मैं उन्हें ओवरलोड के समूह के साथ अनुकरण करूंगा। कोई बेहतर विचार? शायद प्रीप्रोसेसर पुस्तकालय हैं जो नौकरी को कम कर सकते हैं?

उत्तर

7

ऐसा लगता है कि बूस्ट के वर्तमान संस्करण BOOST_NO_VARIADIC_TEMPLATES को परिभाषित करता है की तरह यदि विविध टेम्पलेट अनुपलब्ध हैं। यह boost/config.hpp द्वारा प्रदान किया जाता है; config.hpp दस्तावेज के लिए here देखें।

यदि विविध टेम्पलेट अनुपलब्ध हैं, तो आपको शायद उन्हें ओवरलोड के समूह के साथ अनुकरण करना होगा, जैसा कि आपने कहा था। Boost.Preprocessor लाइब्रेरी यहां सहायता कर सकती है; यह टेम्पलेट अधिभार सहित सभी प्रकार के दोहराव वाले स्रोत कोड को स्वचालित करने के लिए डिज़ाइन किया गया है। आप बौद्धिक टेम्पलेट्स को अनुकरण करने के लिए इसका उपयोग करने के उदाहरणों के लिए BOOST_NO_VARIADIC_TEMPLATES के लिए बूस्ट स्रोत पेड़ खोज सकते हैं।

+1

मैं आपके दृष्टिकोण को नील्स के साथ जोड़ूंगा: बूस्ट के लिए धन्यवाद, विभिन्न धर्मार्थियों के कई अधिभारों के साथ एक इंटरफेस का प्रस्ताव। प्रेप्रोसेसर जो पैरामीटर को 'बूस्ट.फ्यूजन' कंटेनर (टुपल, वेक्टर, आदि ...) में लपेटता है फिर एक एकल टेम्पलेट वर्ग को पारित किया गया जिसमें यह अपेक्षा की जाती है कि वास्तविक कार्यान्वयन किया जाता है। विचार डिबगिंग को आसान बनाने के लिए मैक्रोज़ में कोड की मात्रा को कम करने के लिए है :) –

8

शायद: #ifndef BOOST_NO_VARIADIC_TEMPLATES?


variadic टेम्प्लेट समर्थित नहीं हैं, तो आप को बढ़ावा देने टपल लाइब्रेरी का उपयोग कर के बारे में सोच सकता है:

template<typename Tuple> void coolstuff(Tuple&& args); 

और:

coolstuff(boost::make_tuple(1, 2, 3));