2010-03-01 18 views
8

पर टेम्पलेट पैरामीटर के रूप में विधि के हस्ताक्षर को स्थानांतरित करना मैं अपनी परियोजनाओं में डेटा-हैंडलिंग कक्षाओं के लिए एक टेम्पलेट इंटरफ़ेस बनाना चाहता हूं।किसी वर्ग

मैं कुछ इस तरह लिख सकते हैं:

template <class T> 
class DataHandler 
{ 
    public: 
     void Process(const& T) = 0; 
}; 

फिर, लगता है, मैं एक वर्ग इस तरह से परिभाषित करते हैं:

class MyClass: public DataHandler<int> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
} 

अब, सवाल आते हैं, मैं किसी भी तरह में मेरे टेम्पलेट इंटरफेस परिभाषित कर सकते हैं जिस तरह से पैरामीटर के रूप में यह प्राप्त नहीं होगा, केवल टी टाइप करें, लेकिन प्रक्रिया() फ़ंक्शन का पूरा हस्ताक्षर।

class MyClass: public DataHandler<void (int&)> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
} 

क्या यह संभव है:

मैं इस तरह से काम कर रहे कुछ चाहते हैं? मुझे पता है कि, उदाहरण के लिए, बूस्ट :: सिग्नल इस तरह टेम्पलेट पैरामीटर प्राप्त करता है, लेकिन, अगर मैं सही ढंग से समझता हूं, तो वे वहां बहुत सारे काले जादू का उपयोग करते हैं।

उत्तर

12

हाँ आप कर सकते हैं। लेकिन सी ++ 03 में, आप प्रत्येक पैरामीटर के लिए प्रतिलिपि/पेस्ट कोड करने के लिए बाध्य हैं (बहुत बुरा नहीं है, क्योंकि यहां आपको कॉन्स/गैर-कॉन्स इत्यादि के लिए ओवरलोड की आवश्यकता नहीं होगी। कॉन्स पहले ही ज्ञात है!)।

template<typename FnType> 
struct parm; 

template<typename R, typename P1> 
struct parm<R(P1)> { 
    typedef R ret_type; 
    typedef P1 parm1_type; 
}; 

template <class T> 
class DataHandler 
{ 
    typedef typename parm<T>::ret_type ret_type; 
    typedef typename parm<T>::parm1_type parm1_type; 

    public: 
     virtual ret_type Process(parm1_type t) = 0; 
}; 

class MyClass: public DataHandler<void (const int&)> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
}; 

C++ 0x में, आप

template <class T> 
class DataHandler; 

template<typename R, typename ... P> 
class DataHandler<R(P...)> 
{ 
    public: 
     virtual R Process(P... t) = 0; 
}; 

class MyClass: public DataHandler<void (const int&)> 
{ 
    void Process(const int&) { /* Bla-bla */ } 
}; 

कितना अच्छा लिखने में सक्षम हो जाएगा!

+0

अब प्रश्न बना रहता है: जब तक हम काम पर दैनिक उपयोग के लिए विविध टेम्पलेट्स डाल सकते हैं तब तक कितने साल लगेंगे। यह जानना कि यह कितना आसान हो सकता है ... –

+0

और डेटाप्रोडर्स इंटरफ़ेस में प्रक्रिया() फ़ंक्शन में एक से अधिक पैरामीटर का समर्थन करने के लिए मैं इसे कैसे बदलूं? मेरा मतलब है, मैं डेटाहैंडलर Lev

+0

@Lev जैसे कुछ का समर्थन करना चाहता हूं, मुझे संदेह है कि आपको फ़ंक्शन प्रकार पर आंशिक रूप से 'डेटाहैंडलर' का विशेषज्ञ होना होगा ताकि आपको 'प्रक्रिया' फ़ंक्शन घोषणा मिल सके ठीक है 'बूस्ट :: फंक्शन' आवश्यक कोड जेनरेट करने के लिए प्रीप्रोसेसर का उपयोग करता है, लेकिन अपनी परियोजनाओं और कुछ उपयोगों के लिए, यह उस विषय में खुद को पेश करने के लिए शायद ही कभी उपयोगी है (मेरी राय में) आप शायद बाद में इसकी आवश्यकता नहीं है। तो बस 4 बार कॉपी/पेस्ट करें और किया जाए :) –

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