2012-12-27 8 views
8

में टेम्पलेट मेटाप्रोग्रामिंग का उपयोग करके फ़ंक्शन प्रकार से कॉलिंग सम्मेलन निकालना यह एक काफी लंबा शॉट है, क्योंकि मुझे यकीन नहीं है कि यह संभव है, लेकिन हो सकता है कि टेम्पलेट मेटाप्रोग्रामिंग में मेरे से अधिक अनुभवी कोई मुझे प्रबुद्ध करे।सी ++

मैं एक स्वचालित lua समारोह बाध्यकारी प्रणाली का उपयोग करते हुए टेम्पलेट्स समारोह प्रकार निकालने आंशिक विशेषज्ञता का उपयोग कर लिख रहा हूँ:

template<typename T, T FUNCTION> class Function_c; 
template<typename R, R (*FUNCTION)()> class Function_c<R (*)(), FUNCTION>; //specialized version 

समस्या है, यह मेरे सम्मेलन बुला समारोह नहीं बताता है, तो (VS2012 में 32 बिट्स) यह __stdcall के लिए संकलित नहीं होगा, और यह __fastcall के साथ क्रैश हो जाएगा। मैं किसी विशेष बुला सम्मेलन से निपटने के लिए एक और विशेष संस्करण बना सकते हैं, जैसे:

template<typename R, R (__stdcall *FUNCTION)()> class Function_c<R (__stdcall *)(), FUNCTION>; 

लेकिन क्रमपरिवर्तन की संख्या हाथ से बाहर निकलना शुरू कर रहा है: पैरामीटर बार संख्या के 2 (वैश्विक & सदस्य कार्यों) बार अधिकतम संख्या सम्मेलन बुलावा

तो मैं सोच रहा हूं कि कॉलिंग सम्मेलन को टेम्पलेट पैरामीटर के रूप में प्राप्त करने का कोई तरीका है (शायद नहीं, क्योंकि यह वास्तव में एक प्रकार नहीं है) प्रतिलिपि बनाने की मात्रा को कम करने के लिए।

उत्तर

1

जब आप इस प्रकार के पैरामीटर से निपट रहे हैं, तो आप निम्न में से एक क्या कर सकते हैं।

एक अतिरिक्त पैरामीटर जोड़ें

आपका टेम्पलेट फिर इस तरह दिखेगा:

template < typename T, T function, typename CallType > class Function_c;

आप आसानी से छिपा कर सकते हैं वास्तव में, CallType अंदर प्रेषण इस प्रकार आप एक लागू करने की आवश्यकता ही होगा प्रत्येक प्रकार के कॉल के लिए कक्षा।

एक आवरण

मेरा अनुमान है कि है कि अपने वर्ग पहले से ही एक आवरण वस्तु है, लेकिन आप आसानी एक कदम आगे जा सकते हैं।

आप कॉल प्रकारों में से प्रत्येक के लिए एक आवरण बना सकते हैं, तो करने के लिए टेम्पलेट बदल सकते हैं: Function_c<int, WrapperStdCall<int (*)()> > x;

: इस तरह

template < typename T, typename Functor > class Function_c;

Instanciating

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

  • कोई संबंधित समस्या नहीं^_^