C++ std: کوئی بھی مثال

C Std Kwyy B Y Mthal



C++ پروگرامنگ میں، معیاری ٹیمپلیٹ لائبریری (STL) سے 'std::any' ایک متضاد ڈیٹا کو ہینڈل کرنے کے لیے ایک متحرک ٹائپنگ متعارف کراتی ہے۔ روایتی کنٹینرز کے برعکس، 'std::any' کسی بھی قسم کی قدروں کو ایک کنٹینر کے اندر ذخیرہ کرنے کی اجازت دیتا ہے، ایسے منظرناموں میں لچک کو بڑھاتا ہے جہاں ڈیٹا کی اقسام نامعلوم ہیں یا رن ٹائم میں مختلف ہوتی ہیں۔ یہ قسم کا اگنوسٹک نقطہ نظر ایک عام پروگرامنگ کو فروغ دیتا ہے جو ڈویلپرز کو قسم کی حفاظت کو برقرار رکھتے ہوئے زیادہ قابل اطلاق اور اظہار خیال کوڈ بنانے کی طاقت دیتا ہے۔ اس تلاش میں، ہم 'std::any' کی خصوصیات، اس کے استعمال کے نمونوں، اور عملی مثالوں کا جائزہ لیں گے جو ایک مضبوط اور لچکدار C++ کوڈ لکھنے میں اس کے کردار کو واضح کرتی ہیں۔

مثال 1: Std::کوئی کا بنیادی استعمال

سب سے پہلے، آئیے 'std::any' کے بنیادی استعمال کو ظاہر کرنے کے لیے ایک سیدھی سی مثال دیکھیں۔ ایک ایسے منظر نامے پر غور کریں جہاں آپ کو مختلف قسم کے پیرامیٹرز کو قبول کرنے کے لیے فنکشن کی ضرورت ہو:







یہاں کوڈ کا ٹکڑا ہے:



# شامل کریں
# شامل کریں

باطل عمل کوئی بھی ( const std :: any اور قدر ) {
اگر ( value.has_value ( ) ) {
std::cout << 'ذخیرہ شدہ قیمت کی قسم:' << قدر۔ قسم ( ) نام ( ) << std::endl;

اگر ( قدر۔ قسم ( ) == ٹائپڈ ( int ) ) {
std::cout << 'قدر: ' << std::any_cast < int > ( قدر ) << std::endl;
} اور اگر ( قدر۔ قسم ( ) == ٹائپڈ ( دگنا ) ) {
std::cout << 'قدر: ' << std::any_cast < دگنا > ( قدر ) << std::endl;
} اور اگر ( قدر۔ قسم ( ) == ٹائپڈ ( std::string ) ) {
std::cout << 'قدر: ' << std::any_cast < std::string > ( قدر ) << std::endl;
} اور {
std::cout << 'غیر تعاون یافتہ قسم!' << std::endl;
}
} اور {
std::cout << 'std::any میں کوئی قدر ذخیرہ نہیں ہے۔' << std::endl;
}
}

اہم int ( ) {
عمل کسی بھی ( 42 ) ;
عمل کسی بھی ( 3.14 ) ;
عمل کسی بھی ( std::string ( 'ہیلو، std::any!' ) ) ;
عمل کسی بھی ( 4.5f ) ; // غیر تعاون یافتہ قسم

واپسی 0 ;
}


اس مثال میں، ہم 'processAny' فنکشن کی وضاحت کرتے ہیں جو ایک پیرامیٹر کے طور پر 'std::any' حوالہ لیتا ہے اور اس کے مواد کی جانچ کرتا ہے۔ فنکشن کے اندر، ہم سب سے پہلے چیک کرتے ہیں کہ آیا has_value() کا استعمال کرتے ہوئے 'std::any' متغیر کی کوئی ذخیرہ شدہ قدر ہے۔ اگر کوئی قدر موجود ہے، تو ہم قسم().name() کا استعمال کرتے ہوئے ذخیرہ شدہ قدر کی قسم کا تعین کرتے ہیں اور اس کی قسم کی بنیاد پر متعلقہ قدر کو پرنٹ کرنے کے لیے آگے بڑھتے ہیں۔ مرکزی فنکشن پھر 'processAny' کی افادیت کو مختلف اقسام کے ساتھ کال کرکے ظاہر کرتا ہے: ایک عدد (42)، ایک ڈبل (3.14)، اور ایک تار ('Hello, std::any!')۔ فنکشن ہر قسم کو مناسب طریقے سے ہینڈل کرتا ہے اور متعلقہ اقدار کو پرنٹ کرتا ہے۔ تاہم، جب فلوٹنگ پوائنٹ نمبر (4.5f) پر کارروائی کرنے کی کوشش کی جاتی ہے، جو اس مثال میں غیر تعاون یافتہ ہے، تو پروگرام اس قسم کے غیر تعاون یافتہ ہونے کی نشاندہی کرکے صورت حال کو احسن طریقے سے سنبھالتا ہے۔



پیدا شدہ آؤٹ پٹ ہے:






یہ ظاہر کرتا ہے کہ کس طرح 'std::any' مختلف قسم کے ڈیٹا کی متحرک ہینڈلنگ کو قابل بناتا ہے، جو اسے C++ میں عام پروگرامنگ کے لیے ایک ورسٹائل ٹول بناتا ہے۔

مثال 2: صارف کی طے شدہ اقسام کو ذخیرہ کرنا

دوسری مثال یہ دریافت کرتی ہے کہ معیاری ٹیمپلیٹ لائبریری (STL) کے اندر یہ متحرک قسم کس طرح اپنی مرضی کے ڈیٹا ڈھانچے کو بغیر کسی رکاوٹ کے ایڈجسٹ کرتی ہے۔ صارف کی وضاحت کردہ قسم، پوائنٹ کی ساخت پر توجہ مرکوز کرتے ہوئے، ہم یہ ظاہر کرتے ہیں کہ 'std::any' اس طرح کے ڈھانچے کی مثالوں کو کیسے ہینڈل کرتا ہے۔



یہاں کوڈ ہے:

# شامل کریں
# شامل کریں

کلاس MyClass {
عوام:
میری جماعت ( int قدر ) : ڈیٹا ( قدر ) { }

باطل پرنٹ ڈیٹا ( ) const {
std::cout << 'مائکلاس میں ڈیٹا:' << ڈیٹا << std::endl;
}

نجی:
int ڈیٹا؛
} ;

اہم int ( ) {
std:: any anyObject = MyClass ( 42 ) ;

اگر ( anyObject.has_value ( ) ) {
آٹو اور myClassInstance = std::any_cast < میری جماعت &> ( کوئی بھی آبجیکٹ ) ;
myClassInstance.printData ( ) ;
} اور {
std::cout << 'std::any میں کوئی قدر ذخیرہ نہیں ہے۔' << std::endl;
}

واپسی 0 ;
}


اس C++ کوڈ کے ٹکڑوں میں، ہم 'مائی کلاس' نامی صارف کی وضاحت شدہ کلاس کے ساتھ 'std::any' قسم کا استعمال کرتے ہوئے ایک سادہ مثال بناتے ہیں۔ کلاس کے اندر، اس ڈیٹا کی قدر ظاہر کرنے کے لیے ایک پرائیویٹ ممبر متغیر ہے جسے 'ڈیٹا' کہا جاتا ہے اور ایک عوامی طریقہ ہے جسے printData() کہتے ہیں۔ ایک عددی قدر منظور کی جاتی ہے اور کنسٹرکٹر میں 'ڈیٹا' ممبر کو تفویض کی جاتی ہے۔

'مین' فنکشن میں، ہم 'MyClass' کے ایک آبجیکٹ کو 42 کی ابتدائی قیمت کے ساتھ انسٹینٹیٹ کرتے ہیں اور پھر اسے 'anyObject' نامی 'std::any' متغیر میں اسٹور کرتے ہیں۔ یہ 'std::any' کی صارف کی وضاحت شدہ کلاسوں کی مثالوں کو رکھنے کی صلاحیت کو ظاہر کرتا ہے۔

اس کے بعد، ہم has_value() طریقہ استعمال کرکے یہ چیک کرنے کے لیے 'if' اسٹیٹمنٹ استعمال کرتے ہیں کہ آیا 'anyObject' کی کوئی قدر ہے۔ اگر کوئی قدر ہے تو، ہم 'std::any_cast' کا استعمال کرتے ہوئے ذخیرہ شدہ آبجیکٹ کو بازیافت کرتے ہیں۔ 'std::any_cast' کو 'MyClass&' ٹیمپلیٹ دلیل کے ساتھ استعمال کیا جاتا ہے تاکہ ذخیرہ شدہ آبجیکٹ کو 'MyClass' کے حوالے سے کاسٹ کیا جا سکے۔ اس حوالہ، 'myClassInstance' کو پھر printData() طریقہ کو کال کرنے کے لیے استعمال کیا جاتا ہے، جو 'std::any' کے اندر ذخیرہ شدہ صارف کی وضاحت کردہ قسم تک رسائی اور کام کرنے کی صلاحیت کو ظاہر کرتا ہے۔

اگر 'std::any' میں کوئی قدر محفوظ نہیں ہے، تو ہم اس کی نشاندہی کرنے والا ایک پیغام پرنٹ کرتے ہیں۔ یہ مشروط چیک یقینی بناتا ہے کہ ہم ان منظرناموں کو سنبھالتے ہیں جہاں 'std::any' متغیر خالی ہو سکتا ہے۔

یہاں آؤٹ پٹ ہے:

مثال 3: مخلوط اقسام کا کنٹینر

پروگرامنگ میں، 'مخلوط قسم کے کنٹینر' سے مراد ڈیٹا ڈھانچہ ہے جو متنوع، ممکنہ طور پر غیر متعلقہ ڈیٹا کی اقسام کے عناصر کو رکھنے کے قابل ہے۔ یہ لچک ان منظرناموں سے نمٹنے کے وقت قابل قدر ہے جہاں ڈیٹا کی قسمیں مرتب کرنے کے وقت نامعلوم ہیں یا پروگرام کے عمل کے دوران متحرک طور پر تبدیل ہوتی ہیں۔ C++ میں، 'std::any' اس تصور کی مثال دیتا ہے، جس سے ایک کنٹینر کی تخلیق مختلف اقسام کی اقدار کو ذخیرہ کرنے کی اجازت دیتی ہے۔

آئیے ایک ایسے منظر نامے کو تلاش کریں جہاں ہم ایک کنٹینر بناتے ہیں جس میں مختلف اقسام ہیں:

# شامل کریں
# شامل کریں
#شامل <ویکٹر>

اہم int ( ) {

std :: ویکٹر < std::کوئی بھی > مخلوط کنٹینر؛

mixedContainer.push_back ( 42 ) ;
mixedContainer.push_back ( 3.14 ) ;
mixedContainer.push_back ( std::string ( 'ہیلو' ) ) ;
mixedContainer.push_back ( سچ ) ;

کے لیے ( const آٹو اور عنصر: مخلوط کنٹینر ) {
اگر ( عنصر۔ قسم ( ) == ٹائپڈ ( int ) ) {
std::cout << 'انٹیجر:' << std::any_cast < int > ( عنصر ) << std::endl;
} اور اگر ( عنصر۔ قسم ( ) == ٹائپڈ ( دگنا ) ) {
std::cout << 'دگنا: ' << std::any_cast < دگنا > ( عنصر ) << std::endl;
} اور اگر ( عنصر۔ قسم ( ) == ٹائپڈ ( std::string ) ) {
std::cout << 'سٹرنگ:' << std::any_cast < std::string > ( عنصر ) << std::endl;
} اور اگر ( عنصر۔ قسم ( ) == ٹائپڈ ( bool ) ) {
std::cout << 'بولین:' << std::any_cast < bool > ( عنصر ) << std::endl;
} اور {
std::cout << 'نامعلوم قسم' << std::endl;
}
}

واپسی 0 ;
}


اس مثال میں، ہم C++ اور 'std::any' خصوصیت کا استعمال کرتے ہوئے مخلوط قسم کے کنٹینر کے تصور کو ظاہر کرتے ہیں۔ ہم مختلف قسم کے ڈیٹا کے عناصر کو رکھنے کے لیے اپنے کنٹینر کے طور پر کام کرنے کے لیے 'std::vector' کا نام 'mixedContainer' بناتے ہیں۔ 'push_back' فنکشن کا استعمال کرتے ہوئے، ہم اس کنٹینر کو مختلف عناصر کے ساتھ آباد کرتے ہیں جن میں ایک عدد (42)، ایک ڈبل (3.14)، ایک تار ('ہیلو')، اور ایک بولین (سچ) شامل ہیں۔

جیسا کہ ہم ایک 'for' لوپ کا استعمال کرتے ہوئے 'mixedContainer' کے ذریعے تکرار کرتے ہیں، ہم ہر عنصر کے ڈیٹا کی قسم کو متحرک طور پر شناخت کرنے کے لیے type() فنکشن استعمال کرتے ہیں۔ 'std::any_cast' کا استعمال کرتے ہوئے، ہم ان کی اقسام کی بنیاد پر متعلقہ اقدار کو نکالتے اور پرنٹ کرتے ہیں۔ مثال کے طور پر، اگر عنصر 'int' کی قسم کا ہے، تو ہم اسے ایک عدد کے طور پر پرنٹ کرتے ہیں۔ اگر یہ 'ڈبل' قسم کا ہے، تو ہم اسے ڈبل کے طور پر پرنٹ کرتے ہیں، وغیرہ۔

یہاں پیدا شدہ آؤٹ پٹ ہے:

مثال 4: Std::Any کے ساتھ ہینڈلنگ کی غلطی

'std::any' کا استعمال کرتے وقت غلطیوں کو ہینڈل کرنے میں یہ جانچنا شامل ہے کہ آیا اس قسم کو سپورٹ کیا گیا ہے یا کوئی قدر محفوظ ہے۔ اس مثال میں، ہم غیر تعاون یافتہ اقسام کو ہینڈل کرنے کا طریقہ دکھاتے ہیں:

# شامل کریں
# شامل کریں

اہم int ( ) {
std:: any myAny = 42 ;

کوشش کریں {

ڈبل ویلیو = std::any_cast < دگنا > ( myAny ) ;
std::cout << 'قدر: ' << قدر << std::endl;
} پکڑنا ( const std::bad_any_cast اور یہ ہے ) {

std::cerr << 'خرابی:' << e.what ( ) << std::endl;
}

واپسی 0 ;
}


ہم شروع کرتے ہیں 'std::any' متغیر، 'myAny'، عددی قسم کی 42 کی قدر کے ساتھ۔ بعد کے 'کوشش' بلاک کے اندر، ہم 'std::any_cast' آپریشن کا استعمال کرتے ہوئے اس عددی قدر کو 'ڈبل' میں ڈالنے کی واضح کوشش کرتے ہیں۔ تاہم، چونکہ اصل قسم جو 'myAny' میں محفوظ کی گئی ہے ایک عدد عدد ہے، اس لیے یہ کاسٹنگ آپریشن 'ڈبل' کے لیے غلط ہے جس کی وجہ سے مماثلت نہیں ملتی۔

اس ممکنہ خرابی کو احسن طریقے سے منظم کرنے کے لیے، ہم ایک 'کیچ' بلاک کے ساتھ استثنیٰ ہینڈلنگ نافذ کرتے ہیں جو مخصوص استثنائی قسم 'std::bad_any_cast' کو پکڑنے کے لیے ڈیزائن کیا گیا ہے۔ ایک ناکام کاسٹ کی صورت میں، 'کیچ' بلاک کو چالو کیا جاتا ہے اور ہم غلطی کی نوعیت کو بتانے کے لیے 'std::cerr' کا استعمال کرتے ہوئے ایک ایرر میسج تیار کرتے ہیں۔ غلطی سے نمٹنے کی یہ حکمت عملی اس بات کو یقینی بناتی ہے کہ ہمارا پروگرام خوش اسلوبی سے ان حالات کو سنبھال سکتا ہے جہاں کوشش کی گئی قسم کاسٹ اصل قسم کے ساتھ تصادم کرتی ہے جو 'std::any' متغیر میں محفوظ ہے۔

نتیجہ

اس آرٹیکل میں، ہم نے C++ میں 'std::any' کی ایپلی کیشنز کو دریافت کیا، ایک متحرک قسم کا کنٹینر جو متنوع اقسام کی اقدار کے لیے C++ میں متعارف کرایا گیا ہے۔ ہم نے مختلف مثالوں کے ذریعے اس کی استعداد کا مظاہرہ کیا، ایسے منظرناموں کی نمائش کی جو بنیادی استعمال سے لے کر صارف کی وضاحت کردہ اقسام اور متفاوت مجموعوں کو سنبھالنے تک ہیں۔ ہم نے ان منظرناموں میں اس کے عملی اطلاق کا مظاہرہ کیا جہاں مرتب وقت پر ڈیٹا کی قسم معلوم نہیں ہوتی۔ مزید برآں، ہم نے غلطی سے نمٹنے کی تکنیکوں کے بارے میں دریافت کیا، استثنائی ہینڈلنگ کے ذریعے غیر تعاون یافتہ اقسام کو خوبصورتی سے منظم کرنے کی اہمیت پر زور دیا۔