मैं विंडोज़ एपीआई फ़ंक्शंस को लपेटने की कोशिश कर रहा हूं ताकि त्रुटियों की जांच हो सके। जैसा कि मैंने पिछले SO प्रश्न में पाया है, मैं एपीआई फ़ंक्शन को कॉल करने के लिए टेम्पलेट फ़ंक्शन का उपयोग कर सकता हूं, और फिर सेट किए गए किसी भी त्रुटि को पुनर्प्राप्त करने के लिए GetLastError()
पर कॉल कर सकता हूं। मैं इस त्रुटि को अपने Error
कक्षा में भेज सकता हूं ताकि मुझे इसके बारे में जानकारी मिल सके। का प्रयोग के रूप में यह अद्भुत काम करता हैकंपाइल-टाइम पर जांचें यदि टेम्पलेट तर्क शून्य है
int WINAPI someFunc (int param1, BOOL param2); //body not accessible
int main()
{
int ret = someFunc (5, true); //works normally
int ret2 = Wrap (someFunc, 5, true); //same as above, but I'll get a message if there's an error
}
इस प्रकार यह मैं कोड हो सकता है
template<typename TRet, typename... TArgs>
TRet Wrap(TRet(WINAPI *api)(TArgs...), TArgs... args)
{
TRet ret = api(args...);
//check for errors
return ret;
}
:
यहाँ टेम्पलेट समारोह के लिए कोड है। हालांकि, एक संभावित समस्या है। समारोह
void WINAPI someFunc();
ले लो जब टेम्पलेट समारोह में इस subbing, यह इस प्रकार है:
void Wrap(void(WINAPI *api)())
{
void ret = api(); //<-- ahem! Can't declare a variable of type void...
//check for errors
return ret; //<-- Can't return a value for void either
}
इस के आसपास पाने के लिए, मैं टेम्पलेट मैं कहाँ void
साथ TRet
प्रतिस्थापित का एक संस्करण बनाने की कोशिश की। दुर्भाग्यवश, यह वास्तव में केवल एक अस्पष्टता का कारण बनता है जिसका उपयोग करना है।
कि एक तरफ, मैं
if (strcmp (typeid (TRet).name(), "v") != 0) //typeid(void).name() == "v"
{
//do stuff with variable to return
}
else
{
//do stuff without returning anything
}
का उपयोग कर फिर भी कोशिश की, typeid
एक क्रम तुलना है, इसलिए कोड अभी भी वजह से एक शून्य चर घोषित करने के लिए कोशिश कर रहा करने के लिए संकलन नहीं करता है, भले ही यह कभी नहीं होगा।
अगला, मैंने typeid
के बजाय std::is_same <TRet, void>::value
का उपयोग करने का प्रयास किया, लेकिन पता चला कि यह रनटाइम तुलना भी था।
इस बिंदु पर, मुझे नहीं पता कि आगे क्या प्रयास करना है। क्या संकलक को विश्वास करने की कोई संभावना है कि मुझे पता है कि मैं क्या कर रहा हूं ठीक है? मुझे Wrap
पर एक अतिरिक्त तर्क संलग्न करने में कोई फर्क नहीं पड़ता, लेकिन मैं वास्तव में उसमें से कुछ भी प्राप्त नहीं कर सका।
मैं जीएनयू जी ++ 4.6.1, और विंडोज एक्सपी, साथ ही विंडोज 7 के साथ कोड :: ब्लॉक का उपयोग करता हूं। किसी भी मदद के लिए धन्यवाद, भले ही यह मुझे बता रहा हो कि मुझे केवल Wrap
का उपयोग नहीं करना पड़ेगा शून्य के लिए काम करने वाले कार्यों के लिए।
मुझे समझ में आया कि रिटर्न प्रकार को शून्य के रूप में क्यों काम नहीं किया गया है (वापसी प्रकारों पर असंबद्ध नहीं हो सकता है) लेकिन शून्य ** और ** अतिरिक्त पैरामीटर जोड़ने से काम करना चाहिए, क्या हुआ? आपको स्पष्ट प्रकारों के साथ आना पड़ सकता है। – Tod
दिलचस्प सवाल। साइड नोट: स्थिर रूप से चेक न किए जाने के अलावा, 'टाइपिड' समाधान भी पोर्टेबल नहीं है। मानक 'type_info :: name()' द्वारा लौटाई गई स्ट्रिंग के बारे में कोई गारंटी नहीं देता है। – Thomas
मैंने दोनों के संयोजन के बारे में नहीं सोचा था। मैं इसे आज़माउंगा। टाइपिड मुद्दे पर हेड-अप के लिए भी धन्यवाद। – chris