2010-10-15 19 views
8

का उपयोग कर रूपांतरण मैं वर्गों और एपीआई Boost.Pythonअजगर सेल्सियस तक ++ समारोह Boost.Python

मैं वर्तमान में निम्नलिखित वास्तुकला बनाने की संभावनाओं की जांच कर रहा हूँ की मदद से सी ++ में लिखा और अजगर के संपर्क का एक समूह है।
अजगर में:

from boostPythonModule import * 
AddFunction(boostPythonObject.Method1, args) 
AddFunction(boostPythonObject.Method2, args) 
AddFunction(boostPythonObject.Method2, args) 
RunAll() # running is done by C++ 

C++ में:

void AddFunction(boost::object method, boost::object args) 
{ 
    /// 1. Here i need to extract a real pointer to a function 
    /// 2. Make argument and type checking for a function under method 
    /// 3. Unpack all arguments to native types 
    /// 4. Store the pointer to a function somewhere in local storage 
} 

void RunAll() 
{ 
    /// 1. run all previously stored functions and arguments for them 
} 

मूल रूप से मैं अपने कार्यक्रम के मूल भाग के लिए नीचे सभी कार्यों डाल करने के लिए कोशिश कर रहा हूँ। संकलन समय पर मैं नहीं जानता कि क्या करना चाहिए कार्यों मैं कॉल और क्या तर्क वे स्वीकार कर रहा हूँ - बात यह है कि मुझे यकीन है कि अगर यह बूस्ट metainfo से सभी आवश्यक डेटा निकालने के सामान्य तरीके से ऐसा करना संभव है नहीं कर रहा हूँ है।

कुछ प्रश्न:
1. क्या कोई साझा पाइथन जानकारी तालिका है जिसमें मैं कुछ सामानों की जांच करने के लिए उपयोग कर सकता हूं?
2. Boost.Python तर्क जाँच टाइप करता है। क्या इसे अलग से इस्तेमाल किया जा सकता है?

मुझे अपने विचार बताएं।

धन्यवाद

+0

तुम सच में 'AddFunction()' में सभी प्रकार की जांच की जरूरत है? क्या यह विधि और तर्कों को कहीं भी स्टोर करने के लिए पर्याप्त नहीं होगा और उन विधियों को 'RunAll()' में कॉल करें, इस तरह से आप विधियों को निष्पादित करते समय किसी भी प्रकार की संबंधित त्रुटि प्राप्त करेंगे और बूस्ट। पाइथन आपके लिए यह करेगा । – Arlaharen

+0

अच्छा, नहीं। असल में विचार उन फ़ंक्शन कॉल के बीच समय अंतर को कम करना है, इसलिए सभी तर्कों को पहले चेक किया जाना चाहिए। RuAll केवल सी के बारे में ++ समारोह संकेत दिए गए हैं (यानी functors), किसी भी अन्य सलाह पता होना चाहिए? – Alex

+1

उस मामले में मेरे पास कोई नहीं है। :-) मुझे नहीं लगता कि यह एक उपयोग का मामला है जो बूस्ट.पथन को डिजाइन किया गया था और आपको जो भी चाहिए वो करने के लिए आपको मोड़ने में कठिनाई होगी। क्या आपके तरीकों से कॉल के बीच पाइथन में बिताया गया समय वास्तव में इतना महत्वपूर्ण है कि आपको यह करना है? लेकिन मैं तुम्हें अपने रूपरेखा किया है ... :-) – Arlaharen

उत्तर

1

मैं कैशिंग कार्य करता है और अजगर स्तर पर उनके तर्कों के बारे में सोचना होगा - ट्यूटोरियल के Keyword arguments अनुभाग से नवीनतम प्रपत्र का उपयोग तर्क बचाने के लिए और बाद में unpacking saved arguments अपने सी ++ कार्यों फोन अजगर स्तर पर किया unpacking से आप को अलग होगा किसी भी बूस्ट टाइपफैटी जटिलताओं (सभी टाइपशेकिंग रनएल चरण पर इसे धीमा और कम सुरक्षित बनाने के लिए किया जाएगा)।

स्पीड अनुकूलित दृष्टिकोण एक आम इंटरफेस के साथ एक सी ++ clasess कि एक समारोह स्वीकार कर सकते हैं लागू करने के लिए किया जाएगा दिए गए तर्कों के समर्थन और आंतरिक रूप से उनके मूल्यों कैशिंग बाद में समय में उपयोग करने के लिए कहता है।

struct Runner { 
    virtual int run() = 0; 
}; 

struct ConcreteRunner: public Runner { 
    std::string _arg; 
    void setArguments(std::string arg) {_arg=arg;} 
    virtual int run() {clog << "ConcreteRunner is called with argument" << _arg << endl;} 
}; 

यह दृष्टिकोण RunAll खंड के बाहर पार्स करने इसलिए यह जितनी जल्दी संभव के रूप में बनाने तर्क संभालती है।

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