C++ ستد::اختياري

C Std Akhtyary



يتم توفير ميزة 'std::اختياري' في C++ 17. يسمح 'std::Optional' بتمثيل آمن للقيم الاختيارية أو اختيار وجود قيمة. تحتوي فئة القالب المسماة 'std::اختياري' على قيمة اختيارية قد تحتوي أو لا تحتوي على قيمة صالحة. إنه بديل أكثر أمانًا لتمثيل القيم الفارغة أو الاختيارية من المؤشرات الأولية أو التقنيات الأخرى. يقلل 'std::اختياري' من احتمال حدوث أخطاء في مرجعية المؤشر الفارغ من خلال مطالبة المستخدم بالتحقق بشكل صريح من وجود القيمة قبل استردادها.

مثال 1:

يتم استيراد ملفات الرأس 'الاختيارية' و'iostream' في هذا الرمز. يجب علينا استيراد ملفات الرأس هذه حتى نتمكن من الوصول بسهولة إلى الوظائف المحددة فيها. بعد ذلك، قمنا بتضمين 'مساحة الاسم std' حتى لا نضطر إلى كتابتها مع وظائف منفصلة مثل 'std::اختياري' و'std::cout'. نحن نستخدم 'مساحة الاسم القياسية' هنا. والآن، نضع 'اختياري' أو 'cout' دون كتابة 'std' معهم.

بعد ذلك، نقوم باستدعاء main() ونضع 'اختياري' ونضبطه على 'int' ونعلن عن 'myNum'. إنه بناء الجملة للإعلان عن المتغير 'std::اختياري'. بعد ذلك، نقوم بتهيئة متغير آخر باسم 'value' وتعيين قيمة للمتغير 'myNum' باستخدام الدالة value_or(). نمرر '99' في هذه الدالة، فتقوم بتخصيص هذا '99' للمتغير 'muNum' في حالة عدم وجود قيمة موجودة وتخزينه في متغير 'القيمة'. ثم نضع 'cout' أسفل هذا مما يساعد في عرض القيمة التي خصصناها للمتغير الموجود فوقه.







الكود 1:

#تشمل <اختياري>

#تشمل

استخدام اسم للمحطة ;

كثافة العمليات رئيسي ( ) {

خياري < كثافة العمليات > myNum ;

كثافة العمليات قيمة = myNum. value_or ( 99 ) ;

cout << 'قيمة myNum هي:' << قيمة << endl ;

يعود 0 ;

}

انتاج:



وهنا نلاحظ ظهور الرقم '99' مما يعني أن القيمة لم تكن موجودة بالأعلى وأن القيمة التي أضفناها مخصصة لذلك المتغير.







مثال 2:

نقوم أولاً بتضمين ملفات الرأس ووضع 'مساحة الاسم القياسية'. الآن، تحت هذا، نعلن عن الدالة 'std::اختياري' وهي 'divideFunc()'. إن 'أرباح الأسهم' و'المقسوم عليه' هما المعلمتان لهذه الوظيفة. ثم نستخدم 'if' أسفلها حيث نضيف شرطًا يقول 'divisor != 0'. فإذا تحقق ذلك فإنه يعيد إجابة هذا القسمة حيث نضيف 'عودة' داخل هذا. وإلا، فسيتم إرجاع 'nullopt' مما يعني عدم وجود قيمة للنوع الآمن. الآن نقوم باستدعاء الرئيسي (). للاستدلال على 'std::اختياري'، نضع 'divideFunc()' ونضيف '27, 3' فيه ونخصص النتيجة لمتغير 'الحاصل'.

هنا، نستخدم الكلمة الأساسية 'تلقائي' بحيث تقوم تلقائيًا بضبط نوع البيانات الخاصة بها. بعد ذلك، نضيف 'if' حيث نستخدم 'قيمة has-value' التي تحدد ما إذا كان سيتم استلام قيمة النوع أم لا. بعد ذلك، نضع 'cout' الذي يعرض النتيجة المخزنة في متغير 'الحاصل'، ويحتوي الجزء 'else' على عبارة توضح أن المقسوم عليه هو صفر.



الكود 2:

#تشمل

#تشمل <اختياري>

استخدام اسم للمحطة ;

خياري < كثافة العمليات > com.dividFunc ( كثافة العمليات توزيعات ارباح , كثافة العمليات مقسم ) {

لو ( مقسم != 0 ) {

يعود توزيعات ارباح / مقسم ;

}

يعود nullopt ;

}

كثافة العمليات رئيسي ( ) {

آلي حاصل القسمة = com.dividFunc ( 27 , 3 ) ;

لو ( حاصل القسمة. has_value ( ) ) {

cout << 'الحاصل هو:' << حاصل القسمة. قيمة ( ) << endl ;

} آخر {

cout << 'المقسوم عليه صفر هنا' << endl ;

}

يعود 0 ;

}

انتاج:

يعرض الإخراج النتيجة بعد القسمة مما يعني أن المقسوم عليه ليس صفراً. في هذه الحالة، يتم استخدام 'std::اختياري' لتحديد ما إذا كانت القيمة موجودة أم لا.

مثال 3:

نحن هنا نعلن عن المتغير 'std::اختياري' وهو 'الرقم' الموجود داخل الدالة main(). بعد ذلك، نستخدم 'if' حيث نضع الدالة has_value() مع المتغير 'number' هذا. يتحقق هذا مما إذا كانت هناك قيمة أم لا في هذا المتغير 'الرقم'. إذا كان المتغير 'number' يحتوي على قيمة، فإنه يعرض العبارة التي أضفناها بعد 'if'. وإلا فإنه يعرض العبارة التي وضعناها بعد 'آخر'.

الآن، نقوم بتهيئة 'الرقم' بـ '92' واستخدام 'if' مرة أخرى أسفل هذا حيث تتم إضافة الدالة has_value() مع المتغير 'number' في 'if كشرط'. يحدد هذا ما إذا كان المتغير 'الرقم' له قيمة أم لا. يتم عرض الجملة التي نضيفها بعد 'if' إذا كان للمتغير 'number' قيمة. إذا لم يكن الأمر كذلك، فسيتم تقديم العبارة التي نضعها بعد 'آخر'.

الكود 3:

#تشمل

#تشمل <اختياري>

كثافة العمليات رئيسي ( ) {

الأمراض المنقولة جنسيا :: خياري < كثافة العمليات > رقم ;

لو ( رقم. has_value ( ) ) {

الأمراض المنقولة جنسيا :: cout << 'الرقم موجود:' << رقم. قيمة ( ) << الأمراض المنقولة جنسيا :: endl ;

} آخر {

الأمراض المنقولة جنسيا :: cout << 'الرقم غير موجود.' << الأمراض المنقولة جنسيا :: endl ;

}

رقم = 92 ;

لو ( رقم. has_value ( ) ) {

الأمراض المنقولة جنسيا :: cout << 'الرقم موجود:' << رقم. قيمة ( ) << الأمراض المنقولة جنسيا :: endl ;

} آخر {

الأمراض المنقولة جنسيا :: cout << 'الرقم غير موجود.' << الأمراض المنقولة جنسيا :: endl ;

}

يعود 0 ;

}

انتاج:

يؤدي هذا إلى عرض الجزء 'آخر' أولاً لأننا لا نخصص أي قيمة للمتغير 'std::اختياري'. ثم نقوم بتعيين قيمة لهذا المتغير لعرض تلك القيمة في السطر التالي.

مثال 4:

الآن، نعلن عن ثلاثة متغيرات 'std::اختياري' وهي 'n1' و'n2' و'n3'. نقوم أيضًا بتعيين القيم للمتغيرين 'n2' و'n3' وهما '29' و'45' على التوالي. المتغير 'n1' للفئة 'std::اختياري' فارغ هنا. الآن، نستخدم 'boolalpha' الذي يساعد في إرجاع العائد بصيغة 'صحيح' أو 'خطأ' بدلاً من '1' و'0'.

بعد ذلك، نستخدم العوامل العلائقية بين هذه المتغيرات 'std::Optional' ونضع كل عبارة داخل 'cout' بحيث تعرض أيضًا نتيجة المقارنة التي أضفناها. أولاً، يتحقق من أن 'n3 > n2'، ثم 'n3 < n2'، 'n1 < n2'، 'n1 == std::nullopt'. هنا، يتم استخدام 'nullopt' لمقارنة قيمة النوع غير الآمن أو القيمة الخالية. ثم نتحقق من 'n2 == 49' و'n3 == 88' داخل عبارة 'cout' بشكل منفصل.

الكود 4:

#تشمل <اختياري>

#تشمل

كثافة العمليات رئيسي ( )

{

الأمراض المنقولة جنسيا :: خياري < كثافة العمليات > ن1 ;

الأمراض المنقولة جنسيا :: خياري < كثافة العمليات > n2 ( 29 ) ;

الأمراض المنقولة جنسيا :: خياري < كثافة العمليات > n3 ( أربعة خمسة ) ;

الأمراض المنقولة جنسيا :: cout << الأمراض المنقولة جنسيا :: أبجدية رقمية ;

الأمراض المنقولة جنسيا :: cout << 'The n3 > n2 ' << ( n3 > n2 ) << الأمراض المنقولة جنسيا :: endl ;

الأمراض المنقولة جنسيا :: cout << 'The n3 < n2 ' << ( n3 < n2 ) << الأمراض المنقولة جنسيا :: endl ;

الأمراض المنقولة جنسيا :: cout << 'ن1 <ن2' << ( ن1 < n2 ) << الأمراض المنقولة جنسيا :: endl ;

الأمراض المنقولة جنسيا :: cout << 'إن n1 == فارغ' << ( ن1 == الأمراض المنقولة جنسيا :: nullopt ) << الأمراض المنقولة جنسيا :: endl ;

الأمراض المنقولة جنسيا :: cout << 'ن2 == 49' << ( n2 == 29 ) << الأمراض المنقولة جنسيا :: endl ;

الأمراض المنقولة جنسيا :: cout << 'ن3 == 88' << ( n3 == 88 ) << الأمراض المنقولة جنسيا :: endl ;

}

انتاج:

يقوم برنامج C++ الذي ذكرناه سابقًا بمقارنة قيم متغيرة مختلفة من النوع 'std::اختياري' أثناء طباعة النتيجة إلى الإخراج بشكل متزامن.

مثال 5:

ملفات الرأس المضمنة في هذا الرمز هي 'iostream'، و'fstream'، و'اختياري'، و'string'. يحتوي 'fstream' على تعريف كلتا الوظيفتين 'ofstream' و'ifstream' اللذين نحتاجهما في هذا الكود. الآن، قمنا بتضمين 'مساحة الاسم القياسية'، لذلك لا نضعها بشكل منفصل مع كل وظيفة. بعد ذلك، نستخدم 'std: اختياري' ونعلن عن دالة بالاسم 'ReadFileFunc' حيث نقوم بتمرير 'const string& f_Name' كوسيطة.

ثم لدينا 'ifstream' الذي يساعد على قراءة الملف الذي سيتم إضافة اسمه إلى المتغير 'f_name'. ثم نستخدم 'if' حيث ندرج الشرط الذي يقول إذا لم يتم فتح الملف، فإنه يعيد 'nullopt' كما أضفناه أسفل عبارة 'if'. ثم نقوم بإنشاء وظيفة أخرى وهي 'fileContent' التي تساعد في كتابة المحتوى إلى الملف إذا كان الملف مفتوحًا. هنا، نقوم بوضع 'return fileContent' مرة أخرى والذي يقوم أيضًا بإرجاع المحتوى الذي أضفناه إلى الملف بعد فتحه.

الآن، نسمي 'main()' هنا حيث نقوم بتهيئة المتغير 'f_Name' باسم الملف 'Sample.txt' الذي نريد فتحه. ثم نستدعي 'ReadFileFunc()' هنا ونمرر المتغير 'f_Name' في هذه الوظيفة التي تحاول قراءة الملف وتخزين محتواه في المتغير 'f_content'. تحت هذا، نستخدم 'has_value()' مع المتغير 'f_content' في 'if'. إذا كان هذا المتغير يحتوي على قيمة، فإنه يعرضها أيضًا حيث أضفنا 'cout' أسفل 'if' والذي وضعنا فيه أيضًا 'f_content'. وإلا فإنه يظهر الخطأ الذي أضفناه بعد 'آخر'.

الكود 5:

#تشمل

#تشمل

#تشمل <اختياري>

#تشمل <سلسلة>

استخدام اسم للمحطة ;

خياري < خيط > ReadFileFunc ( مقدار ثابت خيط & f_Name ) {

ifstream myFile ( f_Name ) ;

لو ( ! ملفي. مفتوح ( ) ) {

يعود nullopt ;

}

محتوى ملف السلسلة ( ( isstreambuf_iterator < شار > ( ملفي ) ) , isstreambuf_iterator < شار > ( ) ) ;

يعود fileContent ;

}

كثافة العمليات رئيسي ( ) {

مقدار ثابت سلسلة f_Name = 'نموذج.txt' ;

آلي f_content = ReadFileFunc ( f_Name ) ;

لو ( f_content. has_value ( ) ) {

cout << 'محتوى الملف هو : ' << f_content. قيمة ( ) << endl ;

} آخر {

cerr << 'خطأ: الملف لم يفتح هنا' << f_Name << endl ;

}

يعود 0 ;

}

انتاج:

يعرض هنا بيان الخطأ الذي أضفناه في الجزء 'آخر' كنتيجة للكود المحدد.

خاتمة

في هذا البرنامج التعليمي، اكتشفنا ميزة C++ القوية وهي 'std::Optional' وأوضحنا أنها تقدم طريقة موحدة لتمثيل القيم الاختيارية، والتخلص من متطلبات المراجع الفارغة وتعزيز الوضوح وسلامة التعليمات البرمجية. لقد تعلمنا أنه يعمل أيضًا على تحسين القدرة على شرح المشكلات المعقدة والتعامل مع الأخطاء بسلاسة.