जीआईएल के लिए डिजाइन दिशानिर्देशों द्वारा काम करने की कोशिश कर रहा है, मैं अपने चैनल डेटा प्रकारों के लिए bits__
का उपयोग करता हूं। मेरे पास अक्सर बाहरी डेटा होता है जिसे मैं जीआईएल छवि दृश्यों में लपेट रहा हूं। हालांकि, डेटा पॉइंटर्स के लिए bits__
प्रकारों का उपयोग करने के लिए भी, मुझे अपनी छवि दृश्य बनाने से पहले मुझे reinterpret_cast में जोड़ना होगा। 'आरंभ':: निम्नलिखित कोडबूस्ट :: जीआईएल बिट्स 8 * ग्रे 8_ptr_t पर reinterpret_cast के बिना?
int width = 3;
int height = 2;
boost::gil::bits8 data8[] = {0, 1, 100, 200, 50, 51};
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = pBits8;
boost::gil::gray8_view_t v = interleaved_view(width, height, pGray8, width * sizeof(boost::gil::bits8));
"लाइन 6 पर त्रुटि C2440 त्रुटि में परिणाम ले लो 'को बढ़ावा देने :: गिल :: bits8 *' से परिवर्तित नहीं कर सकते करने के लिए 'को बढ़ावा देने :: गिल :: gray8_ptr_t' 1> इंगित किए गए प्रकार असंबद्ध हैं; रूपांतरण की आवश्यकता है reinterpret_cast, सी-स्टाइल कास्ट या फ़ंक्शन-स्टाइल कास्ट "
जितना संभव हो उतना स्रोत कोड में पहुंचा, ऐसा लगता है कि इन प्रकारों को वास्तव में बिना रिलीज़ किया गया है। बिट्स 8 सिर्फ unsigned char
है, लेकिन gray8_ptr_t
struct pixel<bits8,gray_layout_t>
पर एक पॉइंटर है। इस संरचना का एकमात्र तत्व एक बिट्स 8 है, इसलिए एक reinterpret_cast सुरक्षित दिखता है। यह उन परीक्षणों के लिए भी ठीक काम करता है जिन्हें मैंने फेंक दिया है।
हालांकि, मैं बाहरी डेटा को अक्सर छवि दृश्यों में लपेटता हूं, और हर जगह एक reinterpret_cast होने से समस्याग्रस्त लगता है। जीआईएल में उपयोग के लिए पिक्सेल पॉइंटर बनाने का कोई सुरक्षित तरीका है?
वर्तमान वैकल्पिक हल:
template<class Dest, class Src>
Dest gil_safe_ptr_cast(Src src)
{
// this cast is unsafe, use reinterpret_cast
BOOST_STATIC_ASSERT(false);
}
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8)
{
return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8);
}
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works
boost::gil::bits16* pBits16 = NULL;
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected
+1 खतरनाक जानवरों के बारे में पूरी तरह से पागल नहीं होने के कारण, जैसा कि मुझे संदेह है कि जब आप पहली बार प्रश्न शीर्षक पढ़ते हैं तो हो सकता है। –
मैंने चारों ओर एक काम बनाया है, जो मूल रूप से उन परिसरों की एक सूची है जो इस ऑपरेशन के लिए सुरक्षित होने के लिए जाने जाते हैं – totowtwo
यदि आपने अभी पिक्सेल स्ट्रक्चर बनाया है और बस इसमें बिट्स 8 रखा है तो यह सुरक्षित होगा। रिवर्स रूपांतरण के लिए, बस संरचना से बिट्स 8 निकालें। –