C++ රුසියාව: එය සිදු වූ ආකාරය

නාට්‍යය ආරම්භයේදී බිත්තියේ C++ කේතයක් එල්ලා ඇති බව ඔබ පැවසුවහොත්, අවසානයේ එය ඔබේ පාදයට වෙඩි තැබීමට බැඳී සිටී.

Bjarne Stroustrup

ඔක්තෝබර් 31 සිට නොවැම්බර් 1 දක්වා, C++ රුසියාව Piter සමුළුව ශාන්ත පීටර්ස්බර්ග් හි පැවැත්විණි - JUG Ru සමූහය විසින් සංවිධානය කරන ලද රුසියාවේ මහා පරිමාණ වැඩසටහන් සම්මන්ත්‍රණවලින් එකකි. ආගන්තුක කථිකයන්ට C++ ප්‍රමිති කමිටුවේ සාමාජිකයන්, CppCon කථිකයන්, O'Reilly පොත් කතුවරුන් සහ LLVM, libc++, සහ Boost වැනි ව්‍යාපෘති නඩත්තු කරන්නන් ඇතුළත් වේ. මෙම සම්මන්ත්‍රණය ඉලක්ක කර ඇත්තේ සජීවී සන්නිවේදනයේ ඔවුන්ගේ විශේෂඥතාව ගැඹුරු කිරීමට සහ අත්දැකීම් හුවමාරු කර ගැනීමට අවශ්‍ය පළපුරුදු C++ සංවර්ධකයින් සඳහා ය. සිසුන්ට, උපාධිධාරී සිසුන්ට සහ විශ්ව විද්‍යාල ගුරුවරුන්ට ඉතා හොඳ වට්ටම් ලබා දේ.

සම්මන්ත්‍රණයේ මොස්කව් සංස්කරණය ලබන වසරේ අප්‍රේල් මස මුලදී නැරඹීමට හැකි වනු ඇත, නමුත් මේ අතරතුර අපගේ සිසුන් පසුගිය උත්සවයේදී ඉගෙන ගත් රසවත් දේවල් මොනවාදැයි ඔබට කියනු ඇත. 

C++ රුසියාව: එය සිදු වූ ආකාරය

ඡායාරූපය සම්මන්ත්රණ ඇල්බමය

О нас

ජාතික පර්යේෂණ විශ්ව විද්‍යාලයේ උසස් ආර්ථික විද්‍යා පාසලේ සිසුන් දෙදෙනෙක් - ශාන්ත පීටර්ස්බර්ග් මෙම තනතුර සඳහා වැඩ කළහ:

  • Liza Vasilenko ව්‍යවහාරික ගණිතය සහ පරිගණක විද්‍යා වැඩසටහනේ කොටසක් ලෙස ක්‍රමලේඛන භාෂා හදාරන 4 වන වසරේ උපාධි අපේක්ෂකයෙකි. විශ්ව විද්‍යාලයේ පළමු වසර තුළදී C++ භාෂාව පිළිබඳ දැනුමක් ලබා ගත් මම ඉන් පසුව ක්ෂේත්‍රයේ සීමාවාසික පුහුණුව තුළින් එය සමඟ වැඩ කිරීමේ අත්දැකීම් ලබා ගත්තෙමි. සාමාන්‍යයෙන් ක්‍රමලේඛන භාෂා සහ විශේෂයෙන් ක්‍රියාකාරී ක්‍රමලේඛනය සඳහා ඇති ආශාව සම්මන්ත්‍රණයේ වාර්තා තෝරා ගැනීමේදී එහි සලකුණ තැබීය.
  • Danya Smirnov යනු "වැඩසටහන්කරණය සහ දත්ත විශ්ලේෂණය" යන මාස්ටර් වැඩසටහනේ 1 වන වසරේ සිසුවෙකි. පාසැලේ සිටියදී, මම C++ හි ඔලිම්පියාඩ් ගැටළු ලිව්වා, පසුව එය කෙසේ හෝ සිදු වූයේ භාෂාව අධ්‍යාපන කටයුතුවලදී නිරන්තරයෙන් මතු වී අවසානයේ ප්‍රධාන වැඩ කරන භාෂාව බවට පත්වීමයි. මගේ දැනුම වැඩි දියුණු කර ගැනීමට සහ නව අවස්ථා ගැන ඉගෙන ගැනීමට මම සමුළුවට සහභාගී වීමට තීරණය කළෙමි.

පුවත් පත්‍රිකාවේ, පීඨ නායකත්වය බොහෝ විට අපගේ විශේෂත්වයට අදාළ අධ්‍යාපනික සිදුවීම් පිළිබඳ තොරතුරු බෙදා ගනී. සැප්තැම්බර් මාසයේදී අපි C++ රුසියාව පිළිබඳ තොරතුරු දුටු අතර සවන්දෙන්නන් ලෙස ලියාපදිංචි වීමට තීරණය කළා. මෙවැනි සම්මන්ත්‍රණවලට සහභාගි වීමේ පළමු අත්දැකීම මෙයයි.

සම්මන්ත්රණ ව්යුහය

  • ඩොක්ලාඩි

දින දෙකක කාලය තුළ, විශේෂඥයන් උණුසුම් මාතෘකා රැසක් ආවරණය කරමින් වාර්තා 30 ක් කියවා ඇත: ව්‍යවහාරික ගැටළු විසඳීම සඳහා භාෂා විශේෂාංග දක්ෂ ලෙස භාවිතා කිරීම, නව ප්‍රමිතියට අදාළව ඉදිරියට එන භාෂා යාවත්කාලීන කිරීම්, C++ නිර්මාණයේ සම්මුති සහ ඒවායේ ප්‍රතිවිපාක සමඟ වැඩ කිරීමේදී පූර්වාරක්ෂාව, උදාහරණ රසවත් ව්‍යාපෘති ගෘහ නිර්මාණ ශිල්පය, මෙන්ම භාෂා යටිතල ව්‍යූහය පිළිබඳ විස්තර කිහිපයක්. වරකට ප්‍රසංග 3ක් පැවැත්විණි, බොහෝ විට රුසියානු භාෂාවෙන් දෙකක් සහ ඉංග්‍රීසියෙන් එකක්.

  • සාකච්ඡා කලාප

කථාවෙන් පසු, නොඇසූ ප්රශ්න සහ නිම නොකළ සාකච්ඡා, සලකුණු පුවරු වලින් සමන්විත කථිකයන් සමඟ සන්නිවේදනය සඳහා විශේෂයෙන් නම් කරන ලද ප්රදේශ වෙත මාරු කරන ලදී. ප්‍රසන්න සංවාදයක් සමඟ කතා අතර විරාමය ඉවත් කිරීමට හොඳ ක්‍රමයක්.

  • අකුණු කතා සහ අවිධිමත් සාකච්ඡා

ඔබට කෙටි වාර්තාවක් ලබා දීමට අවශ්‍ය නම්, ඔබට සවස අකුණු සාකච්ඡාව සඳහා සුදු පුවරුවේ ලියාපදිංචි වී සම්මන්ත්‍රණ මාතෘකාව පිළිබඳ ඕනෑම දෙයක් ගැන කතා කිරීමට මිනිත්තු පහක කාලයක් ලබා ගත හැකිය. උදාහරණයක් ලෙස, C++ සඳහා සනීපාරක්ෂක ද්‍රව්‍ය පිළිබඳ ඉක්මන් හැඳින්වීමක් (සමහරුන්ට එය අලුත් විය) හෝ ඇසීමට පමණක් හැකි නමුත් නොපෙනෙන සයින් තරංග උත්පාදනයේ දෝෂයක් පිළිබඳ කතාවකි.

තවත් ආකෘතියක් වන්නේ “හදවතකින් හදවතට කමිටුවක්” යන පැනල සාකච්ඡාවයි. වේදිකාවේ ප්‍රමිතිකරණ කමිටුවේ සමහර සාමාජිකයින් ඇත, ප්‍රොජෙක්ටරය මත ගිනි උදුනක් ඇත (නිල වශයෙන් - අවංක වාතාවරණයක් ඇති කිරීමට, නමුත් “සියල්ල ගිනිගෙන ඇති නිසා” ඊට හේතුව විහිළුවක් ලෙස පෙනේ), C++ හි සම්මතය සහ සාමාන්‍ය දැක්ම පිළිබඳ ප්‍රශ්න , උණුසුම් තාක්ෂණික සාකච්ඡා සහ හොලිවාර් නොමැතිව. යමක් ගැන සම්පූර්ණයෙන්ම විශ්වාස නැති හෝ යමක් නොදන්නා ජීවමාන පුද්ගලයින් ද කමිටුවේ සිටින බව පෙනී ගියේය.

හොලිවර්ස් රසිකයින් සඳහා, තුන්වන සිදුවීම නඩුවේ පැවතුනි - BOF සැසිය "Go vs. C++". අපි Go ආදරවන්තයෙක්, C++ පෙම්වතියක් ගන්නවා, සැසිය ආරම්භ වීමට පෙර ඔවුන් එක්ව මාතෘකාවක් මත විනිවිදක 100500ක් සූදානම් කරමු (C++ හි පැකේජවල ගැටළු හෝ Go හි සාමාන්‍ය කරුණු නොමැතිකම වැනි), පසුව ඔවුන් ඔවුන් අතර සජීවී සාකච්ඡාවක් පවත්වයි. ප්‍රේක්ෂකයින් සමඟ, සහ ප්‍රේක්ෂකයින් එකවර දෘෂ්ටි කෝණයන් දෙකක් තේරුම් ගැනීමට උත්සාහ කරයි. හොලිවර් සන්දර්භයෙන් පිටත ආරම්භ වන්නේ නම්, උපපරිපාලකවරයා මැදිහත් වී පාර්ශවයන් සමගි කරයි. මෙම ආකෘතිය ඇබ්බැහි වීමකි: ආරම්භයේ සිට පැය කිහිපයකට පසුව, විනිවිදකවලින් අඩක් පමණක් සම්පූර්ණ විය. අවසානය බොහෝ සෙයින් වේගවත් කිරීමට සිදු විය.

  • හවුල්කරු ස්ථාවරය

සම්මන්ත්‍රණයේ හවුල්කරුවන් ශාලා තුළ නියෝජනය කරන ලදී - නැවතුම්පොළවල ඔවුන් වත්මන් ව්‍යාපෘති ගැන කතා කළහ, සීමාවාසික පුහුණුව සහ රැකියා පිරිනැමීම, ප්‍රශ්නාවලිය සහ කුඩා තරඟ පැවැත්වූ අතර හොඳ ත්‍යාග ද ලබා ගත්හ. ඒ අතරම, සමහර සමාගම් සම්මුඛ පරීක්ෂණවල ආරම්භක අදියරයන් හරහා යාමට පවා ඉදිරිපත් විය, එය වාර්තාවලට සවන් දීමට පමණක් නොව පැමිණි අයට ප්රයෝජනවත් විය හැකිය.

වාර්තා වල තාක්ෂණික විස්තර

අපි දවස් දෙකේම වාර්තාවලට සවන් දුන්නා. සමහර අවස්ථාවලදී සමාන්තර වාර්තාවන්ගෙන් එක වාර්තාවක් තෝරා ගැනීම දුෂ්කර විය - අපි වෙන් වී විවේක කාලය තුළ ලබාගත් දැනුම හුවමාරු කර ගැනීමට එකඟ විය. එසේ වුවද, බොහෝ දේ ඉතිරි වී ඇති බව පෙනේ. මෙහිදී අපට වඩාත් සිත්ගන්නා සුළු වාර්තා කිහිපයක අන්තර්ගතය ගැන කතා කිරීමට අපි කැමැත්තෙමු

සම්පාදක ප්‍රශස්තකරණයන්හි ප්‍රිස්මය හරහා C++ හි ව්‍යතිරේක, Roman Rusyaev

C++ රුසියාව: එය සිදු වූ ආකාරය
සිට ලිස්සා යන්න презентации

මාතෘකාවෙන් පෙනෙන පරිදි, රෝමන් LLVM උදාහරණයක් ලෙස භාවිතා කරමින් ව්‍යතිරේක සමඟ වැඩ කිරීම දෙස බැලුවේය. ඒ අතරම, ඔවුන්ගේ කාර්යයේදී Clang භාවිතා නොකරන අය සඳහා, වාර්තාවට තවමත් කේතය ප්‍රශස්ත කළ හැකි ආකාරය පිළිබඳ යම් අදහසක් ලබා දිය හැකිය. මෙය එසේ වන්නේ සම්පාදකයින් සහ අනුරූප සම්මත පුස්තකාලවල සංවර්ධකයින් එකිනෙකා සමඟ සන්නිවේදනය කරන අතර බොහෝ සාර්ථක විසඳුම් සමපාත විය හැකි බැවිනි.

එබැවින්, ව්‍යතිරේකයක් හැසිරවීමට, ඔබ බොහෝ දේ කළ යුතුය: හැසිරවීමේ කේතය (ඇත්නම්) හෝ වත්මන් මට්ටමේ නිදහස් සම්පත් අමතන්න සහ තොගය ඉහළට කරකවන්න. ව්‍යතිරේක විසි කළ හැකි ඇමතුම් සඳහා සම්පාදකයා අමතර උපදෙස් එක් කරන බවට මේ සියල්ල හේතු වේ. එබැවින්, ව්යතිරේකය ඇත්ත වශයෙන්ම මතු නොකළහොත්, වැඩසටහන තවමත් අනවශ්ය ක්රියා සිදු කරනු ඇත. කෙසේ හෝ පොදු කාර්ය අඩු කිරීම සඳහා, ව්‍යතිරේක හැසිරවීමේ කේතය එක් කිරීමට හෝ "අමතර" උපදෙස් ගණන අඩු කිරීමට අවශ්‍ය නොවන අවස්ථා නිර්ණය කිරීම සඳහා LLVM සතුව හූරිස්ටික් කිහිපයක් තිබේ.

කථිකයා ඒවායින් දුසිමක් පමණ පරීක්ෂා කර ඒවා වැඩසටහන් ක්‍රියාත්මක කිරීම වේගවත් කිරීමට උපකාරී වන අවස්ථා සහ මෙම ක්‍රම අදාළ නොවන අවස්ථා දෙකම පෙන්වයි.

මේ අනුව, Roman Rusyaev සිසුන්ට ව්‍යතිරේක හැසිරවීම අඩංගු කේතය සෑම විටම ශුන්‍ය උඩින් ක්‍රියාත්මක කළ නොහැකි බව නිගමනය කරන අතර පහත උපදෙස් ලබා දෙයි:

  • පුස්තකාල සංවර්ධනය කිරීමේදී, ප්‍රතිපත්තිමය වශයෙන් ව්‍යතිරේක අත්හැරීම වටී;
  • ව්‍යතිරේක තවමත් අවශ්‍ය නම්, හැකි සෑම විටම noexcept (සහ const) modifiers සෑම තැනකම එකතු කිරීම වටී එවිට සම්පාදකයාට හැකිතාක් ප්‍රශස්තිකරණය කළ හැකිය.

පොදුවේ ගත් කල, ව්‍යතිරේක අවම වශයෙන් භාවිතා කිරීම හෝ සම්පූර්ණයෙන්ම අත්හැර දැමීම යන මතය කථිකයා තහවුරු කළේය.

වාර්තා විනිවිදක පහත සබැඳියෙන් ලබා ගත හැකිය: [“LLVM සම්පාදක ප්‍රශස්තිකරණයේ කාච හරහා C++ ව්‍යතිරේක”]

උත්පාදක යන්ත්‍ර, coroutines සහ අනෙකුත් මොළයට පෙරළෙන පැණි රස, Adi Shavit

C++ රුසියාව: එය සිදු වූ ආකාරය
සිට ලිස්සා යන්න презентации

C++20 හි නවෝත්පාදනයන් සඳහා කැප වූ මෙම සම්මන්ත්‍රණයේ බොහෝ වාර්තා වලින් එකක් එහි වර්ණවත් ඉදිරිපත් කිරීම සඳහා පමණක් නොව, එකතු කිරීමේ සැකසුම් තර්කනය (ලූප්, ආපසු කැඳවීම් සඳහා) සමඟ පවතින ගැටළු පැහැදිලිව හඳුනා ගැනීම සඳහා අමතක නොවන එකක් විය.

Adi Shavit පහත සඳහන් දේ ඉස්මතු කරයි: දැනට පවතින ක්‍රම සමස්ත එකතුව හරහා යන අතර සමහර අභ්‍යන්තර අතරමැදි තත්වයකට ප්‍රවේශය ලබා නොදේ (නැතහොත් ඒවා නැවත ඇමතුම් වලදී සිදු කරයි, නමුත් Callback Hell වැනි අප්‍රසන්න අතුරු ආබාධ විශාල සංඛ්‍යාවක් සමඟ) . පුනරාවර්තකයන් සිටින බව පෙනේ, නමුත් ඒවා සමඟ පවා සියල්ල එතරම් සුමට නොවේ: පොදු ඇතුල්වීම් සහ පිටවීම් ස්ථාන නොමැත (ආරම්භය → අවසානය එදිරිව rbegin → rend සහ යනාදිය), අපි කොපමණ කාලයක් පුනරාවර්තනය වේද යන්න පැහැදිලි නැත? C++20 වලින් පටන් ගත්තොත් මේ ප්‍රශ්න විසඳෙනවා!

පළමු විකල්පය: පරාස. පුනරාවර්තක එතීමෙන්, අපට පුනරාවර්තනයක ආරම්භය සහ අවසානය සඳහා පොදු අතුරු මුහුණතක් ලැබෙන අතර, අපට රචනා කිරීමේ හැකියාවද ලැබේ. මේ සියල්ල සම්පූර්ණ දත්ත සැකසුම් නල මාර්ග තැනීම පහසු කරයි. නමුත් සෑම දෙයක්ම එතරම් සුමට නොවේ: ගණනය කිරීමේ තර්කනයේ කොටසක් නිශ්චිත පුනරාවර්තකයක් ක්රියාත්මක කිරීම ඇතුළත පිහිටා ඇති අතර, කේතය තේරුම් ගැනීමට සහ දෝෂහරණය කිරීමට සංකීර්ණ විය හැකිය.

C++ රුසියාව: එය සිදු වූ ආකාරය
සිට ලිස්සා යන්න презентации

හොඳයි, මෙම අවස්ථාව සඳහා, C++20 එකතු කරන ලද coroutines (Python හි උත්පාදක යන්ත්‍රවලට සමාන වන ක්‍රියා): අතරමැදි තත්වයක් ආරක්ෂා කරමින් යම් වත්මන් අගයක් ලබා දීමෙන් ක්‍රියාත්මක කිරීම කල් දැමිය හැක. මේ අනුව, අපට පෙනෙන පරිදි දත්ත සමඟ වැඩ කිරීම පමණක් නොව, විශේෂිත කෝරූටීන් තුළ ඇති සියලු තර්ක සංග්‍රහ කිරීම ද සාක්ෂාත් කර ගනිමු.

නමුත් විලවුන් වල මැස්සක් ඇත: මේ මොහොතේ ඒවා දැනට පවතින සම්පාදකයින් විසින් අර්ධ වශයෙන් පමණක් සහය දක්වන අතර අප කැමති පරිදි පිළිවෙලට ක්‍රියාත්මක නොවේ: නිදසුනක් ලෙස, කොරූටීන් තුළ යොමු සහ තාවකාලික වස්තූන් භාවිතා කිරීම තවමත් වටින්නේ නැත. තවද, coroutines විය හැකි දේ සම්බන්ධයෙන් යම් සීමාවන් ඇති අතර constexpr ශ්‍රිත, කන්ස්ට්‍රක්ටර්/ඩිස්ට්‍රක්ටර් සහ ප්‍රධාන මෙම ලැයිස්තුවට ඇතුළත් නොවේ.

මේ අනුව, coroutines දත්ත සැකසුම් තර්කනයේ සරල බව සමඟ ගැටළු වලින් සැලකිය යුතු කොටසක් විසඳයි, නමුත් ඒවායේ වර්තමාන ක්‍රියාත්මක කිරීම් වැඩිදියුණු කිරීම අවශ්‍ය වේ.

ද්රව්ය:

Yandex.Taxi, Anton Polukhin වෙතින් C++ උපක්‍රම

මගේ වෘත්තීය ක්‍රියාකාරකම් වලදී, සමහර විට මට සම්පූර්ණයෙන්ම සහායක දේවල් ක්‍රියාත්මක කිරීමට සිදුවේ: අභ්‍යන්තර අතුරුමුහුණත සහ සමහර පුස්තකාලයක API අතර දවටනයක්, ලොග් කිරීම හෝ විග්‍රහ කිරීම. මෙම අවස්ථාවේදී, සාමාන්යයෙන් අතිරේක ප්රශස්තකරණයක් අවශ්ය නොවේ. නමුත් RuNet හි වඩාත් ජනප්‍රිය සේවාවන්හි මෙම සංරචක භාවිතා කරන්නේ නම් කුමක් කළ යුතුද? එවැනි තත්වයක් තුළ, ඔබට පැයකට ටෙරාබයිට් ලොග් තනිවම සැකසීමට සිදුවනු ඇත! එවිට සෑම මිලි තත්පරයක්ම ගණන් ගනී, එබැවින් ඔබට විවිධ උපක්‍රම භාවිතා කිරීමට සිදුවේ - ඇන්ටන් පොලුකින් ඔවුන් ගැන කතා කළේය.

සමහර විට වඩාත්ම සිත්ගන්නා උදාහරණය වූයේ pointer-to-implementation (pimpl) රටාව ක්‍රියාත්මක කිරීමයි. 

#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_; 
};

මෙම උදාහරණයේ දී, පළමුව මට බාහිර පුස්තකාලවල ශීර්ෂ ගොනු ඉවත් කිරීමට අවශ්‍ය වේ - මෙය වේගයෙන් සම්පාදනය කරනු ඇති අතර, ඔබට හැකි නම් ගැටුම් සහ වෙනත් සමාන දෝෂ වලින් ඔබව ආරක්ෂා කර ගත හැකිය. 

හරි, අපි #include .cpp ගොනුව වෙත ගෙන ගියෙමු: අපට ඔතා ඇති API හි ඉදිරි ප්‍රකාශයක් මෙන්ම std::unique_ptr අවශ්‍යයි. දැන් අපට ගතික වෙන් කිරීම් සහ දත්ත පොකුරක් හරහා විසිරී ඇති දත්ත සහ අඩු සහතික කිරීම් වැනි වෙනත් අප්‍රසන්න දේවල් තිබේ. 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_; 
};

එකම ගැටළුව: අපි එක් එක් දවටනය සඳහා ප්‍රමාණය සහ පෙළගැස්ම නියම කිරීමට අවශ්‍යයි - අපි අපගේ pimpl අච්චුව පරාමිතීන් සමඟ සාදා, අත්තනෝමතික අගයන් කිහිපයක් භාවිතා කර අප සියල්ල නිවැරදිව අනුමාන කර ඇති බවට චෙක්පතක් විනාශ කරන්නාට එක් කරමු. : 

~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 දැනටමත් අර්ථ දක්වා ඇති බැවින්, මෙම කේතය නිවැරදිව විග්‍රහ කරනු ලබන අතර සම්පාදනය කිරීමේ අදියරේදී එය දෝෂ ලෙස ඇතුළත් කළ යුතු අවශ්‍ය ප්‍රමාණය සහ පෙළගැස්වීමේ අගයන් ප්‍රතිදානය කරයි. මේ අනුව, එක් අතිරේක සම්පාදන ධාවනයක වියදමින්, අපි ඔතා ඇති පන්තිවල ගතික වෙන්කිරීම් ඉවත් කර, ක්රියාත්මක කිරීම සමඟ .cpp ගොනුවක API සඟවන්න, ප්රොසෙසරය මගින් හැඹිලිගත කිරීම සඳහා වඩාත් සුදුසු මෝස්තරයක් ද ලබා ගනිමු.

ලොග් කිරීම සහ විග්‍රහ කිරීම එතරම් ආකර්ෂණීය නොවන බව පෙනුණු අතර එම නිසා මෙම සමාලෝචනයේ සඳහන් නොවේ.

වාර්තා විනිවිදක පහත සබැඳියෙන් ලබා ගත හැකිය: ["ටැක්සි වෙතින් 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 මූලද්‍රව්‍යයට පරීක්ෂා කිරීමට අවශ්‍ය බව. මතකයට එන පළමු දෙය නම් උපකාරක කාර්යයක් ලිවීමයි_ඕනෑම_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) ස්වයංක්‍රීයව භාවිතා කිරීමෙන්, ප්‍රවේශය, රාජ්‍ය_වර්ගයේ මූලද්‍රව්‍ය සමඟ පමණක් නොව, වර්ගය නොවන සැකිලි පරාමිති ලෙස භාවිතා කළ හැකි ප්‍රාථමික වර්ග සමඟ සැසඳීමට සරලව සාමාන්‍යකරණය කරයි:


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 නොමිලේ බව මතක තබා ගන්න; 
  • අපි පරිපූර්ණ යොමු කිරීමක් එකතු කර lambda වසා දැමීමේ පරාමිති ඇසුරුමට අදාළව එහි අවලස්සන වාක්‍ය ඛණ්ඩය දෙස බලමු;
  • අපි සම්පාදකයාට කොන්දේසි සහිත noexcept සමඟ ප්‍රශස්තිකරණය සඳහා වැඩි අවස්ථා ලබා දෙමු; 
  • ලැම්ඩාස් හි පැහැදිලි ප්‍රතිලාභ අගයන්ට ස්තූතිවන්ත වන පරිදි සැකිලි වල වඩාත් තේරුම්ගත හැකි දෝෂ ප්‍රතිදානය ගැන අපි සැලකිලිමත් වෙමු. සැකිලි ශ්‍රිතය සත්‍ය වශයෙන්ම හැඳින්වීමට පෙර - වර්ගය පරීක්ෂා කිරීමේ අදියරේදී - මෙය සම්පාදකයාට තවත් චෙක්පත් කිරීමට බල කරයි. 

විස්තර සඳහා, කරුණාකර දේශන ද්‍රව්‍ය බලන්න: 

අපගේ හැඟීම්

C++ රුසියාවේ අපගේ පළමු සහභාගීත්වය එහි තීව්‍රතාවය නිසා අමතක නොවන එකක් විය. පුහුණුව සහ සජීවී සන්නිවේදනය අතර රේඛාව බොහෝ දුරට නොපෙනෙන අවංක සිදුවීමක් ලෙස මට C++ රුසියාව පිළිබඳ හැඟීමක් ඇති විය. කථිකයන්ගේ මනෝභාවයේ සිට සිදුවීම් හවුල්කරුවන්ගේ තරඟ දක්වා සෑම දෙයක්ම උණුසුම් සාකච්ඡා සඳහා හිතකර වේ. සම්මන්ත්‍රණයේ අන්තර්ගතය, වාර්තා වලින් සමන්විත වන අතර, C++ නවෝත්පාදන, විශාල ව්‍යාපෘති පිළිබඳ සිද්ධි අධ්‍යයනය සහ දෘෂ්ටිවාදාත්මක වාස්තු විද්‍යාත්මක සලකා බැලීම් ඇතුළුව තරමක් පුළුල් මාතෘකා ආවරණය කරයි. නමුත් C++ සම්බන්ධයෙන් පමණක් නොව භාෂා බාධක ජය ගැනීමට උපකාර වන උත්සවයේ සමාජ සංරචකය නොසලකා හැරීම අසාධාරණ වනු ඇත.

මෙවැනි උත්සවයකට සහභාගී වීමට අවස්ථාව ලබා දීම පිළිබඳව සම්මන්ත්‍රණ සංවිධායකයින්ට අපගේ ස්තූතිය!
C++ රුසියාවේ අතීතය, වර්තමානය සහ අනාගතය ගැන සංවිධායකයින්ගේ සටහන ඔබ දැක ඇති JUG Ru බ්ලොග් අඩවියේ.

කියවීමට ස්තූතියි, අපගේ සිදුවීම් නැවත පැවසීම ප්‍රයෝජනවත් වේ යැයි අපි බලාපොරොත්තු වෙමු!

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න