2016-11-11 19 views
13

पर निर्भर होना चाहिए मैं इस प्रकार एक वर्ग A परिभाषित करने की कोशिश:सदस्य चर का प्रकार निर्माता तर्क के प्रकार

template< typename T > 
class A 
{ 
    public: 
    A(T elem) 
     : _elem(elem) 
    {} 

    private: 
    TYPE _elem; // "TYPE" should be either "T" in case "elem" is an r-value or "T&" in case "elem" is an l-value. 
}; 

यहाँ, मैं चाहता हूँ _elem या तो मामले में प्रकार T के लिए कि निर्माता का तर्क elem एक है elem के मामले में आर-वैल्यू या टाइप T& टाइप एल-वैल्यू है।

क्या कोई जानता है कि इसे कैसे कार्यान्वित किया जा सकता है? और अनुमान है कि क्या तर्क एक lvalue या rvalue है

template <typename T> 
auto make_a (T&& elem) { 
    return A<T>{std::forward<T>(elem)}; 
} 

यह एक अग्रेषण संदर्भ का उपयोग करता है पूरी तरह से अग्रेषण द्वारा A निर्माण करती है:

+1

मैं आपके लिए यह लिखने के लिए पर्याप्त चालाक नहीं हूं, लेकिन आप इसे टेम्पलेट * विशेषज्ञता * का उपयोग करके प्राप्त करते हैं। ध्यान आकर्षित करने के लिए ऊपर उठाया। – Bathsheba

+0

मुझे इसके लिए भी आवश्यकता है (दृश्य कक्षाएं लिखते समय) ... –

उत्तर

12

जब तक हम template argument deduction for class templates मिलता है, तो आप इस के लिए एक सहायक समारोह का उपयोग करना होगा बहस। उदाहरण के तौर पर int लेना, उदाहरण के लिए, यदि कोई लाभा गुजरता है, Tint& होगा, और यदि कोई रावल पारित हो जाता है, तो Tint होगा।

आपका A टेम्पलेट सिर्फ इस तरह दिखना चाहिए:

template< typename T > 
class A 
{ 
    public: 
    A(T elem) 
     : _elem(elem) 
    {} 

    private: 
    T _elem; 
}; 

आप make_a एक दोस्त बनाने के लिए और अगर आप केवल कारखाने विधि से निर्माण की अनुमति देना चाहते निर्माता निजी बना सकता है।

+0

ए के निर्माता में std :: move क्यों उपयोग कर रहा है? – themagicalyang

+0

@themagicalyang Whoops, आदत। – TartanLlama

+0

जब कोई आर-वैल्यू पास हो जाता है, तब टी क्यों 'int' और 'int &&' क्यों नहीं होता है? –

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