2013-04-09 15 views
5

मैं अपने सी ++ पुस्तकालयों को सी # में उपलब्ध कराने के लिए एक रैपर इंटरफ़ेस बनाने के लिए सफलतापूर्वक SWIG का उपयोग कर रहा हूं। हाल ही में मैंने कुछ boost::optional<> ऑब्जेक्ट्स का खुलासा किया और एसडब्ल्यूआईजी के साथ समस्याएं आ रही हैं। क्या इससे निपटने का कोई मानक तरीका है? किसी को इससे पहले इसमें भाग लेना होगा ...क्या आप एक बूस्ट :: वैकल्पिक <> कर सकते हैं?

+0

क्या यह व्यापक सवाल नहीं है कि SWIG कैसे बुद्धिमान करता है एच टेम्पलेट्स? मैंने SWIG का उपयोग नहीं किया है, लेकिन एक त्वरित स्कैन सुझाव देता है कि कुछ सीमाएं टेम्पलेट्स मुद्रित हो सकती हैं। – dotcomslashnet

+2

@ डॉट कॉमस्लाशनेट हां और नहीं। SWIG को किसी भी चीज़ के बारे में अनुवाद/लपेटने के तरीके को अनुकूलित करने के लिए कॉन्फ़िगर किया जा सकता है। मैं उम्मीद कर रहा था कि दोनों एसडब्ल्यूआईजी और 'बूस्ट :: वैकल्पिक <>' व्यापक रूप से पर्याप्त रूप से उपयोग किए जाते हैं कि किसी ने पहले ही ऐसा किया है इसलिए मुझे पहिया का पुन: आविष्कार करने की आवश्यकता नहीं है। :-) – aldo

उत्तर

3

चूंकि एसडब्ल्यूआईजी बूस्ट प्रकारों को समझ नहीं पा रहा है, टाइपमैप को लिखा जाना है। boost::optional<int> के लिए टाइपमैप की एक जोड़ी यहां दी गई है।

%typemap(in) boost::optional<int> %{ 
    if($input == Py_None) 
     $1 = boost::optional<int>(); 
    else 
     $1 = boost::optional<int>(PyLong_AsLong($input)); 
%} 

एक लौटे boost::optional<int> एक कोई नहीं या एक अजगर पूर्णांक में परिवर्तित हो जाएगा:

%typemap(out) boost::optional<int> %{ 
    if($1) 
     $result = PyLong_FromLong(*$1); 
    else 
    { 
     $result = Py_None; 
     Py_INCREF(Py_None); 
    } 
%} 
+0

धन्यवाद! मुझे इसे पायथन के बजाय सी # के लिए अनुकूलित करना होगा, लेकिन यह कोई समस्या नहीं होनी चाहिए। – aldo

+0

ओह, पूरी तरह से आपके सी # टैग को याद किया, लेकिन यह एक छोटा बदलाव होना चाहिए। –

0

एक संभावित सी # समाधान

अजगर, None या एक पूर्णांक से एक समारोह में पारित किया जा सकता std :: vector

#if SWIGCSHARP 

// C++ 
%typemap(ctype) boost::optional<int32_t> "void *" 
%typemap(out) boost::optional<int32_t> %{ 

    std::vector<int32_t> result_vec; 
    if (!!$1) 
    { 
     result_vec = std::vector<int32_t>(1, $1.get()); 
    } 
    else 
    { 
     result_vec = std::vector<int32_t>(); 
    } 

    $result = new std::vector<uint32_t>((const std::vector<uint32_t> &)result_vec); 
%} 

// C# 
%typemap(imtype) boost::optional<int32_t> "global::System.IntPtr" 
%typemap(cstype) boost::optional<int32_t> "int?" 
%typemap(csout, excode=SWIGEXCODE) boost::optional<int32_t> { 
    SWIG_IntVector ret = new SWIG_IntVector($imcall, true);$excode 

    if (ret.Count > 1) { 
     throw new System.Exception("Return vector contains more then one element"); 
    } 
    else if (ret.Count == 1) { 
     return ret[0]; 
    } 
    else { 
     return null; 
    } 
} 

#endif //SWIGCSHARP 
संबंधित मुद्दे