इस मुद्दे पर कुछ बार चर्चा की गई है लेकिन मैंने पाया है कि सभी समाधान या तो काम नहीं किया है या बढ़ावा के स्थिर जोर पर आधारित थे। मेरी समस्या सरल है। मेरे पास एक कक्षा है, और मैं केवल वास्तविक प्रकार (डबल और फ्लोट) की अनुमति देना चाहता हूं। मैं एक संकलन-समय त्रुटि चाहता हूं यदि मैं कक्षा को फ्लोट या डबल के अलावा किसी अन्य प्रकार के साथ चालू करने का प्रयास करता हूं। मैं विजुअल सी ++ का उपयोग कर रहा हूं 11. यहां मैंने जो कोशिश की है:मैं टेम्पलेट क्लास को कुछ अंतर्निर्मित प्रकारों तक कैसे प्रतिबंधित करूं?
template <typename RealType>
class A
{
// Warning C4346
static_assert(std::is_same<RealType, double>::value || std::is_same<RealType, float>::value);
}
template <typename RealType>
class A
{
// Error C2062: type 'unknown' unexpected
static_assert(decltype(RealType) == double || decltype(RealType) == float);
}
कोई विचार? अग्रिम में धन्यवाद!
पहला सवाल है, यह फर्क पड़ता है है? यदि आप किसी अन्य प्रकार के साथ टेम्पलेट को तुरंत चालू करते हैं, और इस प्रकार का इलाज नहीं किया जा सकता है जिस तरह से टेम्पलेट इसका इलाज करने की अपेक्षा करता है, संकलन विफल हो जाएगा। और यदि यह कर सकता है, * केवल * उन दो प्रकारों को प्रभावी ढंग से बहिष्कृत करने की इजाजत देता है ... कहें ... बिगडिसीमल जैसे एक प्रकार। – cHao
विज़ुअल स्टूडियो वास्तव में एक चेतावनी जारी करता है जब static_assert विफल रहता है, और कोई त्रुटि नहीं? एक बग की तरह लगता है। –
यह भी देखें [सी ++ टेम्पलेट्स जो केवल कुछ प्रकार स्वीकार करते हैं] (http://stackoverflow.com/q/874298/) और [सबक्लास को सी ++ टेम्पलेट पैरामीटर प्रतिबंधित करें] (http://stackoverflow.com/q/3175219)।वे सी ++ 11 की भविष्यवाणी करते हैं, लेकिन वे किसी और के लिए एक अच्छा मार्कर बना सकते हैं। – jww