2015-09-23 10 views
5

मुझे मूल रूप से एक ही फ़ंक्शन को लागू करना है लेकिन विभिन्न आकारों के लिए। विशेष रूप से यह कुछ की तरह है ...सी ++ एक विधि का उपयोग करके और चेतावनी के बिना विभिन्न प्रकार के असाइनमेंट को लागू करने का सुरुचिपूर्ण तरीका?

type& operator=(unsigned int); 
type& operator=(unsigned long int); 
type& operator=(unsigned long long int); 
type& operator=(int); 
type& operator=(long int); 
type& operator=(long long int); 
type& operator=(short int); 
//so on and so forth... 

वे, मुख्य विचार होगा "यदि प्रकार व्यापक है बिल्कुल वही बात क्या करना है ... (सिवाय मैं खाता अलग अलग आकार में रखना चाहिए) कार्य के लिए कोड का उपयोग करें ... अन्यथा एक कास्टिंग करें और कोड निष्पादित करें "। क्या केवल एक विधि का उपयोग कर ऐसे सभी दोहराव कोड से बचना संभव है? (मैं नहीं चाहता कि संकलक मुझे कुछ चेतावनी फेंक दें जब मैं संकलित करता हूं ...)।

धन्यवाद

+0

असाइनमेंट विभिन्न कारणों के लिए समस्याग्रस्त है, लेकिन अगर आप यह करना चाहिए: है तुम सिर्फ 'intmax_t के लिए भार के लागू करने की कोशिश की 'और' uintmax_t' ('' से)? – pmdj

+0

हां मैं cstdint का उपयोग कर रहा हूं, मैं बस एक ही कोड लिखने से बचाना चाहता हूं ... सुरुचिपूर्ण और कुशल तरीके से। – user8469759

उत्तर

6

यह सब अभिन्न प्रकार के लिए काम करेंगे:

template< 
    typename T, 
    typename = std::enable_if_t<std::is_integral<T>::value> 
> 
type& operator= (T); 

आप आकार पर निर्भर करना चाहते हैं, यह बस sizeof(T) साथ प्राप्त किया जा सकता। आप इसकी तुलना अपने सबसे वांछित आकार के साथ कर सकते हैं।

यदि आप दो अलग-अलग फ़ंक्शंस चाहते थे, तो आपको उस खंड को भी साथ रखना होगा और कुछ प्रकार के स्थैतिक-सभी का उपयोग करना होगा।

+0

क्या टेम्पलेट्स के लिए कोई विकल्प है? वे पढ़ने के लिए बहुत मुश्किल हैं। – user8469759

+0

@Lukkio क्षमा करें, लेकिन आपको इस विशेष कोड में पढ़ने के लिए क्या मुश्किल लगता है? मुझे लगता है कि यह बहुत सरल है। –

+0

@ टार्टनलामा या डार्न, दाएं। –

6

answer of Bartek Banachewicz के अलावा इसे हल करने का एक वैकल्पिक तरीका में: आदिम पूर्णांक प्रकार से

struct type 
{ 
    ////Solution by Bartek Banachewicz 
    //template<typename T,typename = typename std::enable_if<std::is_integral<T>::value>::type> 
    //type& operator= (T) 
    //{ 
    // return *this; 
    //} 

    template<typename T> 
    auto operator=(T) -> typename std::enable_if<std::is_integral<T>::value, type>::type& 
    { 
     return *this; 
    } 
}; 
+1

मुझे लगता है कि यह लिंक http://stackoverflow.com/a/22515589/1614219 उन लोगों के लिए उपयोगी हो सकता है जो (मेरे जैसे), हस्ताक्षर में '->' वाक्यविन्यास के बारे में नहीं जानते हैं। – dureuill

+0

यह उत्तर बेहतर है क्योंकि यह एकाधिक 'std :: enable_if' ओवरलोड की अनुमति देता है (आप डिफ़ॉल्ट फ़ंक्शन टेम्पलेट तर्क को नहीं बदल सकते हैं) – TemplateRex

संबंधित मुद्दे

 संबंधित मुद्दे