C++23 में त्रुटि प्रबंधन को सुव्यवस्थित करना
आज के C++ विकास में गलतियों को प्रभावी ढंग से संभालना और रिटर्न मानों को प्रबंधित करना आवश्यक है। {std::expected} प्रकार लौटाने वाले फ़ंक्शंस के साथ काम करने की सामान्य विधि में बहुत सारे चेक और त्रुटि प्रबंधन कोड शामिल होते हैं, जो तर्क को जटिल बना सकते हैं और कोड को बनाए रखना अधिक कठिन बना सकते हैं।
यह पेपर त्रुटि प्रबंधन को सरल बनाने के लिए अधिक परिष्कृत और सामान्य विधि के उपयोग की जांच करता है। बॉयलरप्लेट कोड को कम करने और पठनीयता में सुधार करने के लिए, हम एक `magic_apply` विधि के निर्माण की जांच करेंगे जो कई {std::expected} मानों के परिणामों को एकत्रित करती है और उन्हें दूसरे फ़ंक्शन में भेजती है।
आज्ञा | विवरण |
---|---|
std::expected | त्रुटि प्रबंधन के लिए C++ में उपयोग किया जाने वाला एक टेम्पलेट प्रकार जिसमें मान और त्रुटि दोनों को संग्रहीत करने की क्षमता होती है। |
std::unexpected | जब std::expected के साथ प्रयोग किया जाता है, तो यह एक अप्रत्याशित त्रुटि मान दर्शाता है। |
template<typename...> | अनंत संख्या में टेम्पलेट तर्कों के साथ एक विविध टेम्पलेट की रूपरेखा तैयार करता है जिसे वह स्वीकार कर सकता है। |
decltype | टेम्प्लेट प्रोग्रामिंग में उपयोग किया जाता है, विशेष रूप से अभिव्यक्ति के प्रकार का पता लगाने के लिए। |
args.value() | यदि किसी std::expected ऑब्जेक्ट का कोई मान है, तो वह उसमें निहित मान तक पहुँचता है। |
args.has_value() | सत्यापित करता है कि कोई मान std::expected ऑब्जेक्ट में मौजूद है या नहीं। |
(... && args.has_value()) | यह निर्धारित करने के लिए कि क्या प्रत्येक std::expected ऑब्जेक्ट में मान हैं, अभिव्यक्ति को मोड़ें। |
func(args.value()...) | विधि func को कॉल करने के लिए std::expected ऑब्जेक्ट के मानों का उपयोग करता है। |
return unexpected<Err>(args.error()...) | std::expected ऑब्जेक्ट की त्रुटियों से युक्त एक अप्रत्याशित त्रुटि लौटाता है। |
परिवर्तनीय टेम्पलेट्स का उपयोग करके प्रभावी त्रुटि प्रबंधन
C++23 में त्रुटि प्रबंधन को आसान बनाने के लिए स्क्रिप्ट में टाइप का उपयोग किया जाता है। मुख्य लक्ष्य एक सामान्य फ़ंक्शन विकसित करना है जिसे कहा जाता है जो कई के आउटपुट को प्रसारित कर सकता है किसी अन्य फ़ंक्शन के लिए मान। ऐसा करने से, कठिन त्रुटि-जाँच, जो आमतौर पर कई लोगों के साथ काम करते समय आवश्यक होती है, समाप्त हो जाती है std::expected मान कम हो गया है. यह काफी लचीला है क्योंकि इसमें कोई भी संख्या लग सकती है विविध टेम्पलेट्स का उपयोग करके पैरामीटर। किसी भी सामग्री के साथ फ़ंक्शन को कॉल करने से पहले वस्तु, का मौलिक तर्क magic_apply एक गुना अभिव्यक्ति नियोजित करता है, , सब कुछ सुनिश्चित करने के लिए वस्तुओं के वैध मान हैं।
इस विचार को पहले स्क्रिप्ट उदाहरण में सरल प्रकारों का उपयोग करके चित्रित किया गया है और . यह परिभाषित करता है a वह फ़ंक्शन जो बुनियादी गणना करता है, और getA और फ़ंक्शन जो वापस आते हैं प्रकार. यदि दोनों मान से और getB वैध हैं, हम कॉल कर सकते हैं का उपयोग करते हुए ; यदि नहीं, तो त्रुटि प्रसारित हो जाती है। बॉयलरप्लेट कोड को कम करके, यह विधि पठनीयता और रखरखाव को बढ़ाती है। इसी तरह का विचार दूसरी स्क्रिप्ट में प्रस्तुत किया गया है, लेकिन दृष्टिकोण की बहुमुखी प्रतिभा को उजागर करने के लिए, प्रकार और lambda functions उपयोग किया जाता है।
`std::expected} के साथ C++ त्रुटि प्रबंधन में जटिलता को कम करना
C++23 स्क्रिप्ट वैरिएडिक टेम्प्लेट का उपयोग कर रही है
#include <expected>
#include <string>
#include <iostream>
#include <tuple>
using namespace std;
template<typename Func, typename... Args, typename Err>
auto magic_apply(Func func, const expected<Args, Err>&... args) -> expected<decltype(func(args.value()...)), Err> {
if ((... && args.has_value())) {
return func(args.value()...);
} else {
return unexpected<Err>(args.error()...);
}
}
expected<int, string> getA(int x) {
if (x > 0) return x;
return unexpected<string>("Error in getA");
}
expected<double, string> getB(double y) {
if (y > 0) return y;
return unexpected<string>("Error in getB");
}
double compute_all(int a, double b) {
return a + b;
}
int main() {
auto result = magic_apply(compute_all, getA(10), getB(20.5));
if (result) {
cout << "Result: " << result.value() << endl;
} else {
cout << "Error: " << result.error() << endl;
}
return 0;
}
विभिन्न {std::expected} परिणामों का संयोजन C++23 मान
C++23 स्क्रिप्ट लैम्ब्डा फ़ंक्शंस का उपयोग कर रही है
#include <expected>
#include <string>
#include <iostream>
using namespace std;
template<typename Func, typename... Args, typename Err>
auto magic_apply(Func func, const expected<Args, Err>&... args) -> expected<decltype(func(args.value()...)), Err> {
bool all_valid = (args.has_value() && ...);
if (all_valid) {
return func(args.value()...);
} else {
return unexpected<Err>(args.error()...);
}
}
expected<string, string> getA(bool flag) {
if (flag) return "SuccessA";
return unexpected<string>("Failed A");
}
expected<string, string> getB(bool flag) {
if (flag) return "SuccessB";
return unexpected<string>("Failed B");
}
string compute_all(const string& a, const string& b) {
return a + " and " + b;
}
int main() {
auto result = magic_apply(compute_all, getA(true), getB(true));
if (result) {
cout << "Result: " << result.value() << endl;
} else {
cout << "Error: " << result.error() << endl;
}
return 0;
}
वैरिएडिक टेम्प्लेट के साथ C++ त्रुटि प्रबंधन में सुधार
की क्षमता जटिल प्रणालियों में त्रुटि प्रबंधन को काफी हद तक बढ़ाना C++ में इसका उपयोग करने का एक और महत्वपूर्ण लाभ है। कई अतुल्यकालिक क्रियाओं के परिणामों को निर्बाध रूप से संयोजित करना उन स्थितियों में आवश्यक है जब वे सामने आते हैं प्रकार. कोड को सरल बनाने के अलावा, यह विधि मजबूत त्रुटि प्रबंधन की गारंटी देती है। मनमानी संख्या को मिलाकर अधिक बहुमुखी और सामान्य कार्य बनाए जा सकते हैं मूल्यों के साथ variadic templates.
की बहुमुखी प्रतिभा इसे उन फ़ंक्शंस के साथ उपयोग करने की अनुमति देता है जो विभिन्न प्रकार के तर्क लेते हैं। का उपयोग करके कार्यान्वयन को और भी सरल बना दिया गया है , जो स्वचालित रूप से संयुक्त फ़ंक्शन कॉल के रिटर्न प्रकार का अनुमान लगाता है। इसके अलावा, विलय सहित अधिक जटिल कार्यों को प्रबंधित करने के लिए इस तकनीक का विस्तार किया जा सकता है अन्य त्रुटि प्रकारों वाले मानों को बदलना या उन्हें फ़ंक्शन में भेजने से पहले मानों को बदलना। इसकी अनुकूलनशीलता के कारण, पैटर्न का उपयोग सीधी गणनाओं से लेकर जटिल संचालन तक, कई प्रकार के कार्यों के लिए किया जा सकता है।
वैरिएडिक टेम्प्लेट और एसटीडी::अपेक्षित के बारे में अक्सर पूछे जाने वाले प्रश्न
- क्या है ?
- यह एक C++ टेम्प्लेट प्रकार है जो त्रुटि या वैध मान रख सकता है और इसका उपयोग त्रुटि प्रबंधन के लिए किया जाता है।
- कैसे हुआ काम?
- यह कई परिणामों को मिलाकर बार-बार त्रुटि जांच की आवश्यकता को समाप्त करता है मान और उन्हें किसी फ़ंक्शन में पास करना।
- विविध टेम्पलेट क्या हैं?
- वेरिएबल टेम्प्लेट फ़ंक्शन को मनमानी संख्या में पैरामीटर स्वीकार करने में सक्षम बनाकर फ़ंक्शन डिज़ाइन में बड़ी मात्रा में स्वतंत्रता प्रदान करते हैं।
- क्यों उपयोग करें? में ?
- के मूल्यों का उपयोग करना ऑब्जेक्ट स्वचालित रूप से कॉल किए जा रहे फ़ंक्शन के रिटर्न प्रकार को निर्धारित करते हैं।
- है विभिन्न त्रुटि प्रकारों को संभालने में सक्षम?
- हाँ, इसे कार्यशील बनाया जा सकता है कुछ बदलावों के साथ विभिन्न प्रकार की त्रुटि वाले मान।
- उपयोग करने से क्या लाभ होता है प्रस्ताव?
- गलतियों को संभालते समय, यह अपवाद या रिटर्न कोड जैसी अधिक पारंपरिक तकनीकों की तुलना में अधिक अभिव्यंजक और स्वच्छ दृष्टिकोण प्रदान करता है।
- है का हिस्सा ?
- निम्न के अलावा , वास्तव में, यह गलत मान दर्शाता है।
- क्या अतुल्यकालिक क्रियाओं का उपयोग किया जा सकता है? ?
- यह वास्तव में संभालने के लिए अनुकूल है अतुल्यकालिक संचालन द्वारा लौटाए गए मान।
- फोल्ड एक्सप्रेशन क्या है?
- यहां, C++ में फ़ोल्ड एक्सप्रेशन नामक सुविधा का उपयोग यह जांचने के लिए किया जाता है कि क्या सब कुछ है वस्तुओं में सरल तरीके से वैध मान होते हैं।
C++23 में, एकाधिक std::अपेक्षित मानों को संभालने के लिए एक सामान्य फ़ंक्शन को लागू करने से कोड पठनीयता में काफी सुधार होता है और त्रुटि प्रबंधन बहुत सरल हो जाता है। मैजिक_एप्लाई फ़ंक्शन बॉयलरप्लेट कोड को कम करता है और प्रसंस्करण से पहले सभी प्रत्याशित मान सही हैं यह सुनिश्चित करने के लिए विविध टेम्पलेट्स का उपयोग करके रखरखाव को बढ़ाता है। यह विधि एक लचीला समाधान प्रदान करती है जिसे विभिन्न स्थितियों पर लागू किया जा सकता है और आधुनिक C++ प्रोग्रामिंग को विफलताओं से निपटने के लिए एक स्वच्छ, अधिक प्रभावी तरीका प्रदान करता है।