C++ روس: یہ کیسے ہوا۔

اگر ڈرامے کے شروع میں آپ کہتے ہیں کہ دیوار پر C++ کوڈ لٹکا ہوا ہے، تو آخر تک یہ آپ کے پاؤں میں گولی مارنے کا پابند ہے۔

Bjarne Stroustrup

31 اکتوبر سے 1 نومبر تک، سینٹ پیٹرزبرگ میں C++ روس پِیٹر کانفرنس منعقد ہوئی - روس میں بڑے پیمانے پر پروگرامنگ کانفرنسوں میں سے ایک، جس کا اہتمام JUG Ru گروپ نے کیا تھا۔ مہمان مقررین میں C++ سٹینڈرڈز کمیٹی کے اراکین، CppCon اسپیکرز، O'Reilly کتاب کے مصنفین، اور LLVM، libc++، اور Boost جیسے پروجیکٹس کے مینٹینرز شامل ہیں۔ کانفرنس کا مقصد تجربہ کار C++ ڈویلپرز ہیں جو اپنی مہارت کو گہرا کرنا چاہتے ہیں اور لائیو کمیونیکیشن میں تجربات کا تبادلہ کرنا چاہتے ہیں۔ طلباء، گریجویٹ طلباء اور یونیورسٹی کے اساتذہ کو بہت اچھی چھوٹ فراہم کی جاتی ہے۔

کانفرنس کا ماسکو ایڈیشن اگلے سال اپریل کے اوائل میں دیکھنے کے لیے دستیاب ہوگا، لیکن اس دوران ہمارے طلبہ آپ کو بتائیں گے کہ انھوں نے آخری تقریب میں کیا دلچسپ چیزیں سیکھیں۔ 

C++ روس: یہ کیسے ہوا۔

سے تصویر کانفرنس البم

ہمارے بارے میں

نیشنل ریسرچ یونیورسٹی ہائر سکول آف اکنامکس - سینٹ پیٹرزبرگ کے دو طلباء نے اس پوسٹ پر کام کیا:

  • لیزا واسیلینکو 4 سال کی انڈرگریجویٹ طالبہ ہے جو اپلائیڈ میتھمیٹکس اور کمپیوٹر سائنس پروگرام کے حصے کے طور پر پروگرامنگ لینگویجز کا مطالعہ کر رہی ہے۔ یونیورسٹی میں اپنے پہلے سال میں C++ زبان سے واقف ہونے کے بعد، میں نے بعد میں انڈسٹری میں انٹرنشپ کے ذریعے اس کے ساتھ کام کرنے کا تجربہ حاصل کیا۔ پروگرامنگ لینگوئجز کا جنون بالعموم اور فنکشنل پروگرامنگ بالخصوص کانفرنس میں رپورٹس کے انتخاب پر اپنا نشان چھوڑ گیا۔
  • Danya Smirnov ماسٹرز پروگرام "پروگرامنگ اور ڈیٹا تجزیہ" کی 1st سال کی طالبہ ہے۔ اسکول میں ہی، میں نے C++ میں اولمپیاڈ کے مسائل لکھے، اور پھر کسی نہ کسی طرح یہ ہوا کہ یہ زبان تعلیمی سرگرمیوں میں مسلسل سامنے آئی اور آخر کار کام کرنے والی اہم زبان بن گئی۔ میں نے اپنے علم کو بہتر بنانے اور نئے مواقع کے بارے میں جاننے کے لیے کانفرنس میں شرکت کرنے کا فیصلہ کیا۔

نیوز لیٹر میں، فیکلٹی کی قیادت اکثر ہماری خصوصیت سے متعلق تعلیمی واقعات کے بارے میں معلومات کا اشتراک کرتی ہے۔ ستمبر میں ہم نے C++ روس کے بارے میں معلومات دیکھی اور سننے والوں کے طور پر رجسٹر کرنے کا فیصلہ کیا۔ اس طرح کی کانفرنسوں میں شرکت کا یہ ہمارا پہلا تجربہ ہے۔

کانفرنس کا ڈھانچہ

  • رپورٹس

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

  • مباحثہ زون

تقریر کے بعد، تمام غیر پوچھے گئے سوالات اور نامکمل مباحثوں کو مقررین کے ساتھ بات چیت کے لیے مخصوص جگہوں پر منتقل کر دیا گیا، جو مارکر بورڈز سے لیس تھے۔ خوشگوار گفتگو کے ساتھ تقریروں کے درمیان وقفے کو دور کرنے کا ایک اچھا طریقہ۔

  • بجلی کی باتیں اور غیر رسمی گفتگو

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

ایک اور فارمیٹ پینل ڈسکشن ہے "دل سے ہارٹ کمیٹی کے ساتھ۔" اسٹیج پر اسٹینڈرڈائزیشن کمیٹی کے کچھ ممبران ہیں، پروجیکٹر پر ایک چمنی ہے (سرکاری طور پر - ایک مخلص ماحول پیدا کرنے کے لیے، لیکن وجہ "چونکہ ہر چیز آگ پر ہے" زیادہ مضحکہ خیز لگتا ہے)، معیار اور C++ کے عمومی وژن کے بارے میں سوالات۔ ، بغیر گرم تکنیکی بات چیت اور ہولی وار کے۔ معلوم ہوا کہ کمیٹی میں ایسے زندہ لوگ بھی شامل ہیں جنہیں شاید کسی چیز کا مکمل یقین نہ ہو یا کچھ معلوم نہ ہو۔

ہولیورز کے شائقین کے لیے، تیسرا ایونٹ کیس پر رہا - BOF سیشن "گو بمقابلہ C++"۔ ہم سیشن کے آغاز سے پہلے ایک گو پریمی، ایک C++ پریمی لیتے ہیں، وہ مل کر ایک موضوع پر 100500 سلائیڈز تیار کرتے ہیں (جیسے C++ میں پیکیجز کے ساتھ مسائل یا Go میں جنرک کی کمی) اور پھر وہ آپس میں ایک جاندار بحث کرتے ہیں اور سامعین کے ساتھ، اور سامعین ایک ساتھ دو نقطہ نظر کو سمجھنے کی کوشش کرتے ہیں۔ اگر کوئی ہولیور سیاق و سباق سے ہٹ کر شروع ہوتا ہے، تو ماڈریٹر مداخلت کرتا ہے اور فریقین میں صلح کراتا ہے۔ یہ فارمیٹ نشہ آور ہے: شروع ہونے کے کئی گھنٹے بعد، صرف آدھی سلائیڈیں مکمل ہوئیں۔ اختتام کو بہت تیز کرنا پڑا۔

  • ساتھی کھڑا ہے۔

کانفرنس کے شراکت داروں کی نمائندگی ہالوں میں کی گئی - اسٹینڈز میں انہوں نے موجودہ پروجیکٹس کے بارے میں بات کی، انٹرن شپ اور روزگار کی پیشکش کی، کوئز اور چھوٹے مقابلے منعقد کیے، اور اچھے انعامات بھی تقسیم کیے گئے۔ ساتھ ہی، کچھ کمپنیوں نے انٹرویوز کے ابتدائی مراحل سے گزرنے کی پیشکش بھی کی، جو ان لوگوں کے لیے کارآمد ثابت ہو سکتے ہیں جو نہ صرف رپورٹیں سننے آئے تھے۔

رپورٹس کی تکنیکی تفصیلات

ہم نے دونوں دن رپورٹیں سنیں۔ بعض اوقات متوازی رپورٹوں میں سے ایک رپورٹ کا انتخاب کرنا مشکل تھا - ہم نے وقفے کے دوران حاصل کردہ علم کو الگ کرنے اور تبادلہ کرنے پر اتفاق کیا۔ اور اس کے باوجود، ایسا لگتا ہے کہ بہت کچھ چھوڑ دیا گیا ہے. یہاں ہم کچھ رپورٹس کے مندرجات کے بارے میں بات کرنا چاہیں گے جو ہمیں سب سے زیادہ دلچسپ معلوم ہوئیں

C++ میں رعایتیں کمپائلر آپٹیمائزیشن کے پرزم کے ذریعے، رومن روسائیف

C++ روس: یہ کیسے ہوا۔
سے سلائیڈ کریں۔ پیشکشیں

جیسا کہ عنوان سے پتہ چلتا ہے، رومن نے مثال کے طور پر LLVM کا استعمال کرتے ہوئے مستثنیات کے ساتھ کام کرنے کو دیکھا۔ ساتھ ہی، ان لوگوں کے لیے جو اپنے کام میں کلینگ کا استعمال نہیں کرتے، رپورٹ اب بھی کچھ اندازہ دے سکتی ہے کہ کوڈ کو ممکنہ طور پر کس طرح بہتر بنایا جا سکتا ہے۔ ایسا اس لیے ہوتا ہے کیونکہ مرتب کرنے والے اور متعلقہ معیاری لائبریریوں کے ڈویلپر ایک دوسرے کے ساتھ بات چیت کرتے ہیں اور بہت سے کامیاب حل مل سکتے ہیں۔

لہذا، ایک استثناء کو سنبھالنے کے لیے، آپ کو بہت ساری چیزیں کرنے کی ضرورت ہے: ہینڈلنگ کوڈ (اگر کوئی ہے) یا موجودہ سطح پر مفت وسائل کو کال کریں اور اسٹیک کو اونچا کریں۔ یہ سب اس حقیقت کی طرف جاتا ہے کہ کمپائلر کالز کے لیے اضافی ہدایات شامل کرتا ہے جو ممکنہ طور پر مستثنیات کو پھینک دیتے ہیں۔ لہذا، اگر حقیقت میں رعایت نہیں اٹھائی گئی، تو پروگرام پھر بھی غیر ضروری کارروائیاں کرے گا۔ کسی نہ کسی طرح اوور ہیڈ کو کم کرنے کے لیے، LLVM کے پاس ایسے حالات کا تعین کرنے کے لیے بہت سے heuristics ہیں جہاں استثنیٰ ہینڈلنگ کوڈ کو شامل کرنے کی ضرورت نہیں ہے یا "اضافی" ہدایات کی تعداد کو کم کیا جا سکتا ہے۔

اسپیکر ان میں سے تقریباً ایک درجن کا جائزہ لیتا ہے اور دونوں صورتوں کو دکھاتا ہے جہاں وہ پروگرام کے عمل کو تیز کرنے میں مدد کرتے ہیں، اور جہاں یہ طریقے لاگو نہیں ہوتے ہیں۔

اس طرح، رومن روسائیف طالب علموں کو اس نتیجے پر پہنچاتا ہے کہ استثنیٰ ہینڈلنگ پر مشتمل کوڈ ہمیشہ زیرو اوور ہیڈ کے ساتھ نہیں چلایا جا سکتا، اور مندرجہ ذیل مشورہ دیتا ہے:

  • لائبریریوں کو تیار کرتے وقت، یہ اصولی طور پر مستثنیات کو ترک کرنے کے قابل ہے؛
  • اگر اب بھی مستثنیات کی ضرورت ہے، تو جب بھی ممکن ہو، یہ ہر جگہ noexcept (اور const) ترمیم کاروں کو شامل کرنے کے قابل ہے تاکہ مرتب کرنے والا زیادہ سے زیادہ بہتر بنا سکے۔

عام طور پر، اسپیکر نے اس نظریے کی تصدیق کی کہ مستثنیات کو کم سے کم یا مکمل طور پر ترک کر دیا جاتا ہے۔

رپورٹ کی سلائیڈز درج ذیل لنک پر دستیاب ہیں۔ LLVM کمپائلر آپٹیمائزیشن کے لینز کے ذریعے C++ مستثنیات"]

جنریٹر، کوروٹینز اور دیگر دماغ کو اتارنے والی مٹھاس، آدی شیویت

C++ روس: یہ کیسے ہوا۔
سے سلائیڈ کریں۔ پیشکشیں

C++20 میں اختراعات کے لیے وقف اس کانفرنس کی بہت سی رپورٹوں میں سے ایک نہ صرف اس کی رنگین پریزنٹیشن کے لیے یادگار تھی بلکہ کلیکشن پروسیسنگ منطق (لوپ، کال بیکس کے لیے) کے ساتھ موجودہ مسائل کی واضح شناخت کے لیے بھی یادگار تھی۔

Adi Shavit مندرجہ ذیل کو نمایاں کرتا ہے: فی الحال دستیاب طریقے پورے مجموعہ سے گزرتے ہیں اور کچھ اندرونی درمیانی حالت تک رسائی فراہم نہیں کرتے ہیں (یا وہ کال بیکس کی صورت میں کرتے ہیں، لیکن بڑی تعداد میں ناخوشگوار ضمنی اثرات کے ساتھ، جیسے کال بیک ہیل) . ایسا لگتا ہے کہ تکرار کرنے والے موجود ہیں، لیکن ان کے ساتھ بھی سب کچھ اتنا ہموار نہیں ہے: کوئی عام داخلے اور خارجی راستے نہیں ہیں (شروع → اختتام بمقابلہ rbegin → رینڈ اور اسی طرح)، یہ واضح نہیں ہے کہ ہم کب تک تکرار کریں گے؟ C++ 20 سے شروع کرتے ہوئے، یہ مسائل حل ہو جاتے ہیں!

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

C++ روس: یہ کیسے ہوا۔
سے سلائیڈ کریں۔ پیشکشیں

ٹھیک ہے، اس معاملے کے لیے، C++20 نے کوروٹینز (فنکشنز جن کا رویہ ازگر میں جنریٹروں سے ملتا جلتا ہے) کو شامل کیا: ایک درمیانی حالت کو محفوظ رکھتے ہوئے کچھ موجودہ قدر واپس کر کے عمل کو موخر کیا جا سکتا ہے۔ اس طرح، ہم نہ صرف اعداد و شمار کے ساتھ کام کرتے ہوئے حاصل کرتے ہیں جیسا کہ یہ ظاہر ہوتا ہے، بلکہ تمام منطق کو ایک مخصوص کورٹین کے اندر سمیٹ کر بھی حاصل کرتے ہیں۔

لیکن مرہم میں ایک مکھی ہے: اس وقت وہ موجودہ مرتب کرنے والوں کی طرف سے صرف جزوی طور پر سپورٹ کر رہے ہیں، اور ان پر اتنی صفائی سے عمل درآمد بھی نہیں کیا گیا ہے جیسا کہ ہم چاہتے ہیں: مثال کے طور پر، یہ ابھی تک کوروٹینز میں حوالہ جات اور عارضی اشیاء کا استعمال کرنے کے قابل نہیں ہے۔ اس کے علاوہ، اس پر کچھ پابندیاں ہیں کہ کوروٹینز کیا ہو سکتی ہیں، اور اس فہرست میں constexpr فنکشنز، کنسٹرکٹرز/ڈسٹرکٹرز اور مین شامل نہیں ہیں۔

اس طرح، کوروٹینز ڈیٹا پروسیسنگ منطق کی سادگی سے مسائل کا ایک اہم حصہ حل کرتی ہیں، لیکن ان کے موجودہ نفاذ میں بہتری کی ضرورت ہے۔

مواد:

Yandex.Taxi، Anton Polukhin سے C++ ٹرکس

اپنی پیشہ ورانہ سرگرمیوں میں، بعض اوقات مجھے مکمل طور پر معاون چیزوں کو لاگو کرنا پڑتا ہے: اندرونی انٹرفیس اور کچھ لائبریری کے API کے درمیان ایک ریپر، لاگنگ یا پارس کرنا۔ اس صورت میں، عام طور پر کسی اضافی اصلاح کی ضرورت نہیں ہوتی ہے۔ لیکن کیا ہوگا اگر یہ اجزاء RuNet پر کچھ مشہور خدمات میں استعمال کیے جائیں؟ ایسی صورت حال میں، آپ کو اکیلے لاگز کے فی گھنٹہ ٹیرا بائٹس پر عملدرآمد کرنا پڑے گا! پھر ہر ملی سیکنڈ کا شمار ہوتا ہے اور اس لیے آپ کو مختلف چالوں کا سہارا لینا پڑتا ہے - انتون پولوخن نے ان کے بارے میں بات کی۔

شاید سب سے دلچسپ مثال پوائنٹر ٹو امپلیمنٹیشن (پمپل) پیٹرن کا نفاذ تھا۔ 

#include <third_party/json.hpp> //PROBLEMS! 
struct Value { 
    Value() = default; 
    Value(Value&& other) = default; 
    Value& operator=(Value&& other) = default; 
    ~Value() = default; 

    std::size_t Size() const { return data_.size(); } 

private: 
    third_party::Json data_; 
};

اس مثال میں، پہلے میں بیرونی لائبریریوں کی ہیڈر فائلوں سے چھٹکارا حاصل کرنا چاہتا ہوں - یہ تیزی سے مرتب ہو جائے گا، اور آپ نام کے ممکنہ تنازعات اور اسی طرح کی دیگر غلطیوں سے خود کو محفوظ رکھ سکتے ہیں۔ 

ٹھیک ہے۔ اب ہمارے پاس متحرک مختص اور دیگر ناخوشگوار چیزیں ہیں جیسے ڈیٹا کے ایک گروپ میں بکھرے ہوئے ڈیٹا اور کم گارنٹیاں۔ std::aligned_storage اس سب میں مدد کر سکتا ہے۔ 

struct Value { 
// ... 
private: 
    using JsonNative = third_party::Json; 
    const JsonNative* Ptr() const noexcept; 
    JsonNative* Ptr() noexcept; 

    constexpr std::size_t kImplSize = 32; 
    constexpr std::size_t kImplAlign = 8; 
    std::aligned_storage_t<kImplSize, kImplAlign> data_; 
};

صرف ایک مسئلہ: ہمیں ہر ریپر کے لیے سائز اور سیدھ کی وضاحت کرنے کی ضرورت ہے - آئیے اپنے پمپل ٹیمپلیٹ کو پیرامیٹرز کے ساتھ بنائیں، کچھ صوابدیدی اقدار استعمال کریں اور ڈسٹرکٹر پر ایک چیک شامل کریں جس کا ہم نے سب کچھ ٹھیک اندازہ لگایا ہے۔ : 

~FastPimpl() noexcept { 
    validate<sizeof(T), alignof(T)>(); 
    Ptr()->~T(); 
}

template <std::size_t ActualSize, std::size_t ActualAlignment>
static void validate() noexcept { 
    static_assert(
        Size == ActualSize, 
        "Size and sizeof(T) mismatch"
    ); 
    static_assert(
        Alignment == ActualAlignment, 
        "Alignment and alignof(T) mismatch"
    ); 
}

چونکہ ڈسٹرکٹر پر کارروائی کرتے وقت T کی پہلے ہی تعریف کی گئی ہے، اس لیے اس کوڈ کو صحیح طریقے سے پارس کیا جائے گا اور تالیف کے مرحلے پر یہ مطلوبہ سائز اور سیدھ کی قدروں کو آؤٹ پٹ کرے گا جنہیں غلطیوں کے طور پر درج کرنے کی ضرورت ہے۔ اس طرح، ایک اضافی کمپلیشن رن کی قیمت پر، ہم لپیٹے ہوئے کلاسوں کی متحرک تقسیم سے چھٹکارا پاتے ہیں، عمل درآمد کے ساتھ API کو .cpp فائل میں چھپاتے ہیں، اور ایک ایسا ڈیزائن بھی حاصل کرتے ہیں جو پروسیسر کے ذریعے کیشنگ کے لیے زیادہ موزوں ہو۔

لاگنگ اور تجزیہ کم متاثر کن لگ رہا تھا اور اس لیے اس جائزے میں اس کا ذکر نہیں کیا جائے گا۔

رپورٹ کی سلائیڈز درج ذیل لنک پر دستیاب ہیں۔ ["ٹیکسی سے C++ ٹرکس"]

اپنے کوڈ کو DRY رکھنے کی جدید تکنیک، Björn Fahller

اس گفتگو میں، Björn Fahller بار بار کنڈیشن چیکس کی اسٹائلسٹک خامی کا مقابلہ کرنے کے کئی مختلف طریقے دکھاتا ہے:

assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);

واقف آواز؟ حالیہ معیارات میں متعارف کرائی گئی کئی طاقتور C++ تکنیکوں کو استعمال کرتے ہوئے، آپ کارکردگی کے کسی جرمانے کے بغیر اسی فعالیت کو خوبصورتی سے نافذ کر سکتے ہیں۔ موازنہ کریں:   

assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));

غیر متعین تعداد میں چیک کو سنبھالنے کے لیے، آپ کو فوری طور پر متغیر ٹیمپلیٹس اور فولڈ ایکسپریشنز استعمال کرنے کی ضرورت ہے۔ آئیے فرض کریں کہ ہم enum کے state_type عنصر میں متعدد متغیرات کی مساوات کو چیک کرنا چاہتے ہیں۔ سب سے پہلی چیز جو ذہن میں آتی ہے وہ ہے مددگار فنکشن لکھنا is_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) { 
    return ((s == ts) || ...); 
}

انٹرمیڈیٹ کا یہ نتیجہ مایوس کن ہے۔ ابھی تک کوڈ زیادہ پڑھنے کے قابل نہیں ہو رہا ہے:

assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); 

غیر قسم کے ٹیمپلیٹ پیرامیٹرز صورتحال کو تھوڑا بہتر بنانے میں مدد کریں گے۔ ان کی مدد سے، ہم enum کے قابل شمار عناصر کو ٹیمپلیٹ پیرامیٹرز کی فہرست میں منتقل کریں گے: 

template <state_type ... states>
bool is_any_of(state_type t) { 
    return ((t == states) | ...); 
}
	
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); 

غیر قسم کے ٹیمپلیٹ پیرامیٹر (C++17) میں آٹو کا استعمال کرتے ہوئے، نقطہ نظر نہ صرف state_type عناصر کے ساتھ موازنہ کو عام کرتا ہے، بلکہ قدیم اقسام کے ساتھ بھی جو غیر قسم کے ٹیمپلیٹ پیرامیٹر کے طور پر استعمال کیے جا سکتے ہیں:


template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
    return ((t == alternatives) | ...);
}

ان یکے بعد دیگرے بہتری کے ذریعے، چیک کے لیے مطلوبہ روانی نحو حاصل کیا جاتا ہے:


template <class ... Ts>
struct any_of : private std::tuple<Ts ...> { 
// поленимся и унаследуем конструкторы от tuple 
        using std::tuple<Ts ...>::tuple;
        template <typename T>
        bool operator ==(const T& t) const {
                return std::apply(
                        [&t](const auto& ... ts) {
                                return ((ts == t) || ...);
                        },
                        static_cast<const std::tuple<Ts ...>&>(*this));
        }
};

template <class ... Ts>
any_of(Ts ...) -> any_of<Ts ... >;
 
assert(any_of(IDLE, DISCONNECTING, DISCONNECTED) == state);

اس مثال میں، کٹوتی گائیڈ مرتب کرنے والے کو مطلوبہ ڈھانچے کے سانچے کے پیرامیٹرز تجویز کرنے کا کام کرتی ہے، جو کنسٹرکٹر کے دلائل کی اقسام کو جانتا ہے۔ 

مزید - زیادہ دلچسپ. Bjorn سکھاتا ہے کہ کس طرح == سے آگے موازنہ آپریٹرز کے لیے نتیجے کوڈ کو عام کیا جائے، اور پھر صوابدیدی کارروائیوں کے لیے۔ راستے میں، اس طرح کی خصوصیات جیسے no_unique_address attribute (C++20) اور lambda فنکشنز (C++20) میں ٹیمپلیٹ پیرامیٹرز کو استعمال کی مثالوں کے ذریعے بیان کیا گیا ہے۔ (ہاں، اب لیمبڈا نحو کو یاد رکھنا اور بھی آسان ہے - یہ ہر قسم کے قوسین کے لگاتار چار جوڑے ہیں۔) فنکشنز کو کنسٹرکٹر کی تفصیلات کے طور پر استعمال کرتے ہوئے حتمی حل واقعی میری روح کو گرما دیتا ہے، لیمبڈا کی بہترین روایات میں اظہار ٹوپل کا ذکر نہ کرنا۔ کیلکولس

آخر میں، اسے پالش کرنا نہ بھولیں:

  • یاد رکھیں کہ lambdas مفت میں constexpr ہیں۔ 
  • آئیے کامل فارورڈنگ شامل کریں اور لیمبڈا بندش میں پیرامیٹر پیک کے سلسلے میں اس کے بدصورت نحو کو دیکھیں۔
  • آئیے کمپائلر کو مشروط noexcept کے ساتھ اصلاح کے مزید مواقع دیتے ہیں۔ 
  • آئیے لیمبڈاس کی واضح واپسی کی قدروں کی بدولت ٹیمپلیٹس میں مزید قابل فہم ایرر آؤٹ پٹ کا خیال رکھیں۔ یہ کمپائلر کو ٹیمپلیٹ فنکشن کو اصل میں بلانے سے پہلے مزید چیک کرنے پر مجبور کرے گا - ٹائپ چیکنگ کے مرحلے پر۔ 

تفصیلات کے لیے، براہ کرم لیکچر کے مواد کو دیکھیں: 

ہمارے تاثرات

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

ہم ایسی تقریب میں شرکت کے موقع پر کانفرنس کے منتظمین کا شکریہ ادا کرتے ہیں!
آپ نے C++ روس کے ماضی، حال اور مستقبل کے بارے میں منتظمین کی پوسٹ دیکھی ہوگی۔ JUG Ru بلاگ پر.

پڑھنے کے لیے شکریہ، اور ہم امید کرتے ہیں کہ ہمارے واقعات کو دوبارہ بیان کرنا مددگار تھا!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں