C++ الأمراض المنقولة جنسيا: أي أمثلة

C Alamrad Almnqwlt Jnsya Ay Amthlt



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

مثال 1: الاستخدام الأساسي لـ Std::Any

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







هنا مقتطف شفرة:



#تشمل
#تشمل <أي>

عملية باطلةAny ( ثابت الأمراض المنقولة جنسيا::أي & قيمة ) {
لو ( value.has_value ( ) ) {
الأمراض المنقولة جنسيا::كوت << 'نوع القيمة المخزنة:' << value.type ( ) .اسم ( ) << ستد::endl;

لو ( value.type ( ) == typeid ( كثافة العمليات ) ) {
الأمراض المنقولة جنسيا::كوت << 'قيمة: ' << الأمراض المنقولة جنسيا::any_cast < كثافة العمليات > ( قيمة ) << ستد::endl;
} آخر لو ( value.type ( ) == typeid ( مزدوج ) ) {
الأمراض المنقولة جنسيا::كوت << 'قيمة: ' << الأمراض المنقولة جنسيا::any_cast < مزدوج > ( قيمة ) << ستد::endl;
} آخر لو ( value.type ( ) == typeid ( الأمراض المنقولة جنسيا::سلسلة ) ) {
الأمراض المنقولة جنسيا::كوت << 'قيمة: ' << الأمراض المنقولة جنسيا::any_cast < الأمراض المنقولة جنسيا::سلسلة > ( قيمة ) << ستد::endl;
} آخر {
الأمراض المنقولة جنسيا::كوت << 'نوع غير مدعوم!' << ستد::endl;
}
} آخر {
الأمراض المنقولة جنسيا::كوت << 'لا توجد قيمة مخزنة في std::any.' << ستد::endl;
}
}

انت مين ( ) {
ProcessAny ( 42 ) ;
ProcessAny ( 3.14 ) ;
ProcessAny ( الأمراض المنقولة جنسيا::سلسلة ( 'مرحبا، ستد::أي!' ) ) ;
ProcessAny ( 4.5f ) ; // غير مدعوم يكتب

يعود 0 ;
}


في هذا المثال، نحدد الدالة 'processAny' التي تأخذ مرجع 'std::any' كمعلمة وتفحص محتواه. داخل الدالة، نتحقق أولاً مما إذا كان المتغير 'std::any' يحتوي على قيمة مخزنة باستخدام has_value(). في حالة وجود قيمة، نحدد نوع القيمة المخزنة باستخدام type().name() ونتابع طباعة القيمة المقابلة بناءً على نوعها. توضح الوظيفة الرئيسية بعد ذلك فائدة 'processAny' من خلال استدعائها بأنواع مختلفة: عدد صحيح (42)، مزدوج (3.14)، وسلسلة ('Hello, std::any!'). تتعامل الوظيفة مع كل نوع بشكل مناسب وتطبع القيم المعنية. ومع ذلك، عند محاولة معالجة رقم الفاصلة العائمة (4.5f)، وهو غير مدعوم في هذا المثال، يعالج البرنامج الموقف بأمان من خلال الإشارة إلى أن النوع غير مدعوم.



الناتج الذي تم إنشاؤه هو:






يوضح هذا كيف يتيح 'std::any' المعالجة الديناميكية لأنواع البيانات المختلفة، مما يجعلها أداة متعددة الاستخدامات للبرمجة العامة في C++.

المثال 2: تخزين الأنواع المعرفة من قبل المستخدم

يستكشف المثال الثاني كيف يستوعب هذا النوع الديناميكي داخل مكتبة النماذج القياسية (STL) بنيات البيانات المخصصة بسلاسة. من خلال التركيز على نوع محدد من قبل المستخدم، وهو بنية النقطة، نعرض كيف يتعامل 'std::any' مع مثيلات هذه الهياكل.



هنا هو الرمز:

#تشمل
#تشمل <أي>

فئة ماي كلاس {
عام:
صفي ( قيمة كثافة العمليات ) : بيانات ( قيمة ) { }

بيانات الطباعة باطلة ( ) مقدار ثابت {
الأمراض المنقولة جنسيا::كوت << 'البيانات في MyClass:' << بيانات << ستد::endl;
}

خاص:
بيانات كثافة العمليات؛
} ;

انت مين ( ) {
std::any AnyObject = MyClass ( 42 ) ;

لو ( AnyObject.has_value ( ) ) {
آلي & myClassInstance = std::any_cast < صفي &> ( AnyObject ) ;
myClassInstance.printData ( ) ;
} آخر {
الأمراض المنقولة جنسيا::كوت << 'لا توجد قيمة مخزنة في std::any.' << ستد::endl;
}

يعود 0 ;
}


في مقتطف كود C++ هذا، قمنا بإنشاء مثال بسيط لتوضيح استخدام النوع 'std::any' مع فئة محددة من قبل المستخدم تسمى 'MyClass'. يوجد داخل الفصل متغير عضو خاص يسمى 'data' وطريقة عامة تسمى printData() لعرض قيمة هذه البيانات. يتم تمرير قيمة عددية وتخصيصها لعضو 'البيانات' في المُنشئ.

في الوظيفة 'الرئيسية'، نقوم بإنشاء كائن من 'MyClass' بقيمة أولية 42 ثم نقوم بتخزينه في المتغير 'std::any' المسمى 'anyObject'. يوضح هذا قدرة 'std::any' على الاحتفاظ بمثيلات الفئات المعرفة من قبل المستخدم.

بعد ذلك، نستخدم عبارة 'if' للتحقق مما إذا كان 'anyObject' له قيمة باستخدام طريقة has_value(). إذا كانت هناك قيمة، فإننا نقوم باسترجاع الكائن المخزن باستخدام “std::any_cast”. يتم استخدام 'std::any_cast' مع وسيطة القالب 'MyClass&' لإرسال الكائن المخزن إلى مرجع 'MyClass'. يتم بعد ذلك استخدام هذا المرجع، 'myClassInstance'، لاستدعاء طريقة printData()، مما يعرض القدرة على الوصول إلى النوع المخزن المحدد من قبل المستخدم والعمل عليه داخل 'std::any'.

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

هنا هو الإخراج:

مثال 3: حاوية الأنواع المختلطة

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

دعنا نستكشف سيناريو حيث نقوم بإنشاء حاوية تحتوي على أنواع مختلفة:

#تشمل
#تشمل <أي>
#تشمل <ناقل>

انت مين ( ) {

الأمراض المنقولة جنسيا::ناقل < الأمراض المنقولة جنسيا::أي > حاوية مختلطة;

mixContainer.push_back ( 42 ) ;
mixContainer.push_back ( 3.14 ) ;
mixContainer.push_back ( الأمراض المنقولة جنسيا::سلسلة ( 'مرحبًا' ) ) ;
mixContainer.push_back ( حقيقي ) ;

ل ( ثابت السيارات & العنصر: حاوية مختلطة ) {
لو ( نوع العنصر ( ) == typeid ( كثافة العمليات ) ) {
الأمراض المنقولة جنسيا::كوت << 'عدد صحيح:' << الأمراض المنقولة جنسيا::any_cast < كثافة العمليات > ( عنصر ) << ستد::endl;
} آخر لو ( نوع العنصر ( ) == typeid ( مزدوج ) ) {
الأمراض المنقولة جنسيا::كوت << 'مزدوج: ' << الأمراض المنقولة جنسيا::any_cast < مزدوج > ( عنصر ) << ستد::endl;
} آخر لو ( نوع العنصر ( ) == typeid ( الأمراض المنقولة جنسيا::سلسلة ) ) {
الأمراض المنقولة جنسيا::كوت << 'خيط: ' << الأمراض المنقولة جنسيا::any_cast < الأمراض المنقولة جنسيا::سلسلة > ( عنصر ) << ستد::endl;
} آخر لو ( نوع العنصر ( ) == typeid ( منطقي ) ) {
الأمراض المنقولة جنسيا::كوت << 'منطقية:' << الأمراض المنقولة جنسيا::any_cast < منطقي > ( عنصر ) << ستد::endl;
} آخر {
الأمراض المنقولة جنسيا::كوت << 'نوع غير معروف' << ستد::endl;
}
}

يعود 0 ;
}


في هذا الرسم التوضيحي، نوضح مفهوم الحاوية من النوع المختلط باستخدام لغة C++ وميزة 'std::any'. نقوم بإنشاء 'std::vector' المسمى 'mixedContainer' ليكون بمثابة حاوية لدينا لاستيعاب عناصر أنواع البيانات المختلفة. باستخدام وظيفة 'push_back'، نقوم بملء هذه الحاوية بعناصر مختلفة بما في ذلك عدد صحيح (42)، ومضاعفة (3.14)، وسلسلة ('Hello')، وقيمة منطقية (صحيح).

أثناء قيامنا بالتكرار عبر 'mixedContainer' باستخدام حلقة 'for'، فإننا نستخدم وظيفة type() لتحديد نوع بيانات كل عنصر ديناميكيًا. باستخدام 'std::any_cast'، نقوم باستخراج وطباعة القيم المقابلة بناءً على أنواعها. على سبيل المثال، إذا كان العنصر من النوع 'int'، فإننا نطبعه كعدد صحيح. وإذا كان من النوع 'مزدوج' نطبعه مزدوجا، وهكذا.

هنا هو الإخراج الذي تم إنشاؤه:

المثال 4: معالجة الأخطاء باستخدام Std::Any

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

#تشمل
#تشمل <أي>

انت مين ( ) {
الأمراض المنقولة جنسيا::أي myAny = 42 ;

يحاول {

قيمة مزدوجة = std::any_cast < مزدوج > ( myAny ) ;
الأمراض المنقولة جنسيا::كوت << 'قيمة: ' << قيمة << ستد::endl;
} يمسك ( ثابت std::bad_any_cast & إنها ) {

الأمراض المنقولة جنسيا ::سير << 'خطأ: ' << e.what ( ) << ستد::endl;
}

يعود 0 ;
}


نبدأ بتهيئة المتغير 'std::any'، 'myAny'، بقيمة 42 من النوع الصحيح. داخل كتلة 'المحاولة' اللاحقة، نقوم بمحاولة صريحة لتحويل هذه القيمة الصحيحة إلى 'مزدوج' باستخدام عملية 'std::any_cast'. ومع ذلك، نظرًا لأن النوع الفعلي المخزن في 'myAny' هو عدد صحيح، فإن عملية الإرسال هذه غير صالحة لـ 'مزدوج' مما يؤدي إلى نوع غير متطابق.

لإدارة هذا الخطأ المحتمل بأمان، نقوم بتنفيذ معالجة الاستثناء باستخدام كتلة 'catch' المصممة لالتقاط نوع الاستثناء المحدد 'std::bad_any_cast'. في حالة عدم نجاح الإرسال، يتم تنشيط كتلة 'catch' ونقوم بإنشاء رسالة خطأ باستخدام 'std::cerr' لتوصيل طبيعة الخطأ. تضمن إستراتيجية معالجة الأخطاء هذه أن برنامجنا يمكنه التعامل بأمان مع المواقف التي يتعارض فيها النوع الذي تمت محاولته مع النوع الفعلي المخزن في المتغير 'std::any'.

خاتمة

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