2008-09-30 12 views
5

मेरे पास कॉलबैक कक्षाओं का एक सेट है जिसका उपयोग मैं चरम संख्याओं के साथ कॉलबैक को संभालने के लिए करता हूं। अभी अलग-अलग तर्कों को संभालने के लिए मेरे पास 6 अलग-अलग उदाहरण हैं। तर्कों की परिवर्तनीय संख्या को संभालने से एक उदाहरण बनाने का कोई तरीका है ?? आखिर में मैं प्रत्येक पैरामीटर को पीओडी प्रकार या क्लास पॉइंटर, या स्ट्रक्चर पॉइंटर होना पसंद करूंगा। कोई विचार?क्या टेम्पलेट वर्ग में पैरामीटर की एक चर संख्या को संभालने का कोई तरीका है?

template <class T> 
class kGUICallBackPtr 
{ 
public: 
    kGUICallBackPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *)); 
    inline void Call(T *i) {if(m_func) m_func(m_obj,i);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *); 
}; 


template <class T,class U> 
class kGUICallBackPtrPtr 
{ 
public: 
    kGUICallBackPtrPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *,U *)); 
    inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *,U *j); 
}; 

उत्तर

5

अभी तक नहीं भाषा में ही लेकिन C++ 0x variadic templates के लिए समर्थन होगा।

0

Boost Bind के उपयोग के माध्यम से इस समस्या को दूर करने के बारे में कैसे? आप अपना कोड एक ही तर्क स्वीकार कर सकते हैं, या कोई भी नहीं, और कॉल साइट पर आपको आवश्यक तर्कों को बांध सकते हैं।

3

सी ++ 0x variatdic टेम्पलेट्स आपकी सबसे अच्छी शर्त है, लेकिन इससे पहले कि आप उनका उपयोग कर सकें, कुछ समय भी होगा।

यदि आपको आज के प्रकारों की आवश्यकता है, तो MPL के vector प्रकारों के साथ-साथ अन्य प्रकार अनुक्रम प्रकारों पर नज़र डालें। यह Boost लाइब्रेरी का हिस्सा है। यह आपको एक टेम्पलेट तर्क प्रदान करने की अनुमति देता है जो कि केवल एक ही प्रकार के बजाय प्रकारों का अनुक्रम है।

0

मेरा पहला विकल्प आपके लक्ष्य को प्राप्त करने के लिए boost :: bind, boost :: function, या std :: bind/std :: function और/या C++ 11 lambda का उपयोग करना होगा। लेकिन अगर आपको अपना खुद का मज़ेदार रोल करने की ज़रूरत है तो मैं एक 'फ़्यूज्ड फ़ैक्टर' बनाने के लिए बूस्ट फ़्यूज़न का उपयोग करूंगा जो एक टेम्पलेट तर्क लेता है।

http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

अंततः इन पुस्तकालयों के सभी के लिए सभी संभव विकल्पों की गणना करने में varidic टेम्पलेट्स की कमी के आसपास काम करने के लिए पूर्व प्रोसेसर मैक्रो का उपयोग।