अन्य उत्तर के अलावा, यह ध्यान दिया जाना चाहिए मौसम प्रकार अभिन्न अंग है या नहीं है कि परीक्षण रनटाइम पर, लेकिन यह भी संकलन समय पर इस्तेमाल किया जा सकता के आधार पर सही कार्यान्वयन चयन करने के लिए:
रनटाइम संस्करण :
// Include either <boost/type_traits/is_integral.hpp> (if using Boost)
// or <type_traits> (if using c++1x)
// In the following, is_integral shoudl be prefixed by either boost:: or std::
template <typename T>
void algorithm(const T & t)
{
// some code
if (is_integral<T>::value)
{
// operations to perform if T is an integral type
}
else
{
// operations to perform if T is not an integral type
}
// some other code
}
हालांकि, इस समाधान सुधार किया जा सकता है जब एल्गोरिथ्म के कार्यान्वयन बहुत परीक्षण पर निर्भर करता है। इस मामले में, हम समारोह के शीर्ष पर परीक्षण, तो एक बड़ा then
ब्लॉक और एक बड़ा else
ब्लॉक होगा। इस मामले में एक आम दृष्टिकोण फ़ंक्शन को अधिभारित करना है और संकलक को SFINAE का उपयोग करके सही कार्यान्वयन का चयन करना है। एक आसान तरीका है यह करने के लिए boost::enable_if
उपयोग करने के लिए है:
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>
template <typename T>
typename boost::enable_if<boost::is_integral<T> >::type
algorithm(const T & t)
{
// implementation for integral types
}
template <typename T>
typename boost::disable_if<boost::is_integral<T> >::type
algorithm(const T & t)
{
// implementation for non integral types
}
जब algorithm
समारोह लागू, संकलक "का चयन करें" सही टेम्पलेट पैरामीटर मौसम पर निर्भर करता है कार्यान्वयन अभिन्न अंग है या नहीं।
स्रोत
2010-08-11 13:57:12
बहुत उपयोगी, धन्यवाद – davka
मैं कहूंगा कि इसके अनाज के हर कंपाइलर आपके पहले उदाहरण में मृत शाखा को खत्म कर देगा - यह काफी आसान है। –
@ जॉर्ज ट्रिट्स्शे: यह सच है, इसलिए मैंने संभावित प्रदर्शन लाभ के बारे में कुछ भी नहीं कहा। फिर भी, मुझे लगता है कि ओवरलोडिंग दृष्टिकोण स्पष्ट है: दो कार्यान्वयन अलग-अलग विकसित हो सकते हैं, और मुझे स्थिर (संकलित समय पर ज्ञात/प्रदर्शन) और गतिशील (रनटाइम पर ज्ञात/प्रदर्शन) के बीच भेदभाव करना बेहतर लगता है। लेकिन ठीक है, ऐसा इसलिए हो सकता है क्योंकि मैंने पिछले महीनों में मेटाप्रोग्रामिंग करने में बहुत अधिक समय बिताया था! –