के लिए मिला है, इसलिए, मैं एक to_python कनवर्टर बनाने की कोशिश कर रहा हूं जो मुझे एक उजागर समारोह से एक बढ़ावा :: वैकल्पिक वापस करने की अनुमति देगा और वैकल्पिक सेट होने पर इसे टी के रूप में माना जाएगा और यदि नहीं तो कोई नहीं। C++Sig पर मिली एक पोस्ट के आधार पर, मैंने निम्नलिखित कोड लिखा था।बूस्ट पायथन कोई to_python कनवर्टर std :: string
template<typename T>
struct optional_ : private boost::noncopyable {
struct conversion {
static PyObject* convert(boost::optional<T> const& value) {
if (value) {
return boost::python::to_python_value<T>()(*value);
}
Py_INCREF(Py_None);
return Py_None;
}
};
explicit optional_() {
boost::python::to_python_converter<boost::optional<T>, conversion>();
}
};
जहां तक मेरा बता सकते हैं, यह optionals परिवर्तित करने के लिए काम करता है, लेकिन अजगर फेंकता निम्नलिखित अपवाद "लेखन त्रुटि: कोई to_python (दर-मूल्य) सी ++ प्रकार के लिए पाया कनवर्टर: std :: स्ट्रिंग"। मुझे पता है कि सी ++ स्ट्रिंग्स को पायथन में कनवर्ट करने में सक्षम है क्योंकि मेरे अधिकांश खुला फ़ंक्शन स्ट्रिंग लौटते हैं। क्यों बढ़ावा नहीं देता :: python :: to_python_value इसे पहचानता है, और मैं इसके कनवर्टर का उपयोग कैसे कर सकता हूं?
निम्नलिखित (पर this article आधार पर) के लिए बदलने के द्वारा निश्चित:
template<typename T>
struct optional_ : private boost::noncopyable {
struct conversion {
static PyObject* convert(boost::optional<T> const& value) {
using namespace boost::python;
return incref((value ? object(*value) : object()).ptr());
}
};
explicit optional_() {
boost::python::to_python_converter<boost::optional<T>, conversion>();
}
};
अब दूसरे संस्करण इतना है कि यह क्लीनर है और बेहतर काम करता है बस क्या करना है।
कृपया एक उत्तर के लिए अपने समाधान के लिए कदम है और यह स्वीकार करते हैं। –