मैं चल बिन्दु प्रकार (निम्नतम स्तर पर सिर्फ एक uint16_t
) एक आधा सटीक करने के लिए विभिन्न प्रकार के अंकगणित परिवर्तित करने के लिए कार्य करता है और मैं पूर्णांक के लिए विभिन्न कार्यों और चल बिन्दु स्रोत प्रकार, SFINAE और std::enable_if
का उपयोग कर :SFINAE भेदभाव पर हस्ताक्षर किए और अहस्ताक्षरित
template<typename T>
uint16_t to_half(typename std::enable_if<
std::is_floating_point<T>::value,T>::type value)
{
//float to half conversion
}
template<typename T>
uint16_t to_half(typename std::enable_if<
std::is_integral<T>::value,T>::type value)
{
//int to half conversion
}
ये स्पष्ट इन्स्टेन्शियशन द्वारा एक सार्वभौमिक टेम्प्लेट की निर्माता से आंतरिक रूप से कहा जाता है:
template<typename T>
half::half(T rhs)
: data_(detail::conversion::to_half<T>(rhs))
{
}
यह संकलित करता है तथा यह भी ठीक काम करता है। अब मैं पर हस्ताक्षर किए और अहस्ताक्षरित पूर्णांकों के बीच अंतर करने, दो कार्यों के साथ दूसरे समारोह की जगह का प्रयास करें:
template<typename T>
uint16_t to_half(typename std::enable_if<std::is_integral<T>::value &&
std::is_signed<T>::value,T>::type value)
{
//signed to half conversion
}
template<typename T>
uint16_t to_half(typename std::enable_if<std::is_integral<T>::value &&
std::is_unsigned<T>::value,T>::type value)
{
//unsigned to half conversion
}
लेकिन एक बार मैं संकलन करने की कोशिश इस VS2010 मुझे
त्रुटि C2995 देता है:
"uint16_t math::detail::conversion::to_half(std::enable_if<std::tr1::is_integral<_Ty>::value && std::tr1::is_signed<_Ty>::value, T>::type)"
: समारोह टेम्पलेट पहले ही परिभाषित किया गया है।
तो ऐसा लगता है कि यह दो टेम्पलेट्स के बीच असंबद्ध नहीं हो सकता है, लेकिन स्पष्ट रूप से फ्लोटिंग पॉइंट संस्करण के साथ अभिन्न संस्करण के साथ कोई समस्या नहीं थी।
लेकिन चूंकि मैं इतना टेम्पलेट जादूगर नहीं हूं, इसलिए मैं यहां कुछ स्पष्ट याद कर रहा हूं (या शायद यह वास्तव में काम करना चाहिए और केवल एक वीएस -2010 बग है)। तो यह क्यों काम नहीं करता है और इसे यथासंभव कुछ प्रोग्रामिंग ओवरहेड के साथ और मानक-केवल सुविधाओं (यदि संभव हो) की सीमाओं में भी कैसे बनाया जा सकता है?
यह स्पष्ट नहीं है कि 'is_signed' /' is_unsigned' पारस्परिक रूप से अनन्य है (हैलो 'char'?)। दूसरा संस्करण बनाने का प्रयास करें '! Std :: is_signed :: value' इसके बजाय। –
क्या आप सदस्यों में से किसी एक के लिए 'std :: is_signed :: value' का उपयोग करने का प्रयास कर सकते हैं और'! Std :: is_signed :: दूसरे के लिए मूल्य'? यह सुनिश्चित करने के लिए है कि केवल कुछ प्रकार नहीं हैं जिनमें 'is_signed' और' is_unsigned' के लिए असंगत सेटिंग्स हैं। –
@ केरेकस्क और बीटमार हा, उसने ऐसा किया! विश्वास नहीं कर सकता था कि यह इतना आसान था। अगर कोई इसे उत्तर के रूप में जोड़ता है तो मैं इसे स्वीकार करूंगा। –