2013-02-27 129 views
5

मैं एक पुस्तकालय लिख रहा हूं जिसमें टेम्पलेट चालबाजी और बूस्ट :: दोनों की अच्छी मात्रा शामिल है। जहाँ मैं अनिवार्य रूप से यह है कि मैं एक स्थिति हुई:बढ़ावा :: किसी भी और टेम्पलेट्स

boost::any a1, a2, a3, a4; 

... और मैं एक समारोह जो इस तरह दिखता है कॉल करने की आवश्यकता:

template <typename A1, typename A2, typename A3, typename A4> 
void somefunc (A1 a1, A2 a2, A3 a3, A4 a4); 

मैं एक अश्लीलतापूर्वक नेस्टेड श्रृंखला का सहारा सकता है अगर बयान, लेकिन मानते हुए कि मैं 10 अलग-अलग प्रकारों को संभालने वाला हूं, तो 10,000 बयान है! बूस्ट प्रीप्रोसेसर यहां मदद कर सकता है, लेकिन यह अभी भी एक भयानक समाधान है।

क्या इस तरह की पागलपन का उपयोग किए बिना किसी बूस्ट :: की सामग्री के साथ टेम्पलेट फ़ंक्शन को कॉल करने का कोई बेहतर तरीका है? जहां तक ​​मैं कह सकता हूं, वहां नहीं है।

+0

केवल की 'को बढ़ावा देने के उपयोगकर्ता :: any' उदाहरण रनटाइम पर सटीक मान प्राप्त कर सकता है (एक हार्डकोडेड प्रकार की आपूर्ति), आप उस फ़ंक्शन को 'बूस्ट :: किसी भी' के भीतर मौजूद मान के साथ कॉल नहीं कर सकते क्योंकि यह प्रकार संकलित समय पर * मिटाया गया था *। आप जिस समस्या को हल करने की कोशिश कर रहे हैं वह बड़ी समस्या क्या है? 'बूस्ट :: कोई भी बहुत कम स्तर की सामग्री है। – GManNickG

+3

सभी ऑब्जेक्ट्स को एक ऑब्जेक्ट के रूप में रखें, और उन्हें एक साथ सेट करते समय, सही 'somefunc' तात्कालिकता (जैसे 'और somefunc ') के लिए एक पॉइंटर सुरक्षित करें। – Xeo

+0

@GManNickG बड़ी समस्या जिसे मैं हल करने की कोशिश कर रहा हूं, में एक तरफ लुआ बाइंडिंग की ऑटो-पीढ़ी शामिल है, और एक बूस्ट :: किसी भी मनमानी एसिंक्रोनस फ़ंक्शन से परिणाम धारण करता है। इस स्थिति में किसी को भी दूसरे के साथ प्रतिस्थापित नहीं किया जा सकता है। – Xtapolapocetl

उत्तर

10

यदि आपके सभी any ऑब्जेक्ट्स एक ही समय में सेट किए जा सकते हैं, तो आप फ़ंक्शन पॉइंटर के लिए बस कड़ी-कोड टाइप कर सकते हैं। इसे एक अलग वस्तु में भरें और आप जाने के लिए अच्छे हैं। यह मूल रूप से type-erasure पर एक डबल ले, और भी आभासी कार्य (जैसे कैसे boost::any आंतरिक रूप से काम करता है) के माध्यम से लागू किया जा सकता है, लेकिन मैं इस संस्करण अधिक पसंद:

// note that this can easily be adapted to boost::tuple and variadic templates 
struct any_container{ 
    template<class T1, class T3, class T3> 
    any_container(T1 const& a1, T2 const& a2, T3 const& a3) 
    : _ichi(a1), _ni(a2), _san(a3), _somefunc(&somefunc<T1, T2, T3>) {} 

    void call(){ _somefunc(_ichi, _ni, _san); } 

private: 
    boost::any _ichi, _ni, _san; 
    // adjust to your need 
    typedef void (*func_type)(boost::any&, boost::any&, boost::any&); 
    func_type _somefunc; 

    template<class T1, class T2, class T3> 
    void somefunc(boost::any& a1, boost::any& a2, boost::any& a3){ 
    // access any objects with 'boost::any_cast<TN>(aN)' 
    } 
}; 
+0

शानदार, धन्यवाद। – Xtapolapocetl

+0

+1, खासकर चर के लिए _ichi, _ni, और _san। –