C++ ืจื•ืกื™ื”: ืื™ืš ื–ื” ืงืจื”

ืื ื‘ืชื—ื™ืœืช ื”ื”ืฆื’ื” ืืชื” ืื•ืžืจ ืฉื™ืฉ ืงื•ื“ C++ ืชืœื•ื™ ืขืœ ื”ืงื™ืจ, ืื– ืขื“ ื”ืกื•ืฃ ื”ื•ื ื—ื™ื™ื‘ ืœื™ืจื•ืช ืœืš ื‘ืจื’ืœ.

ื‘ื™ืืจื ื” ืฉื˜ืจื•ืกื˜ืจื•ืค

ื‘ื™ืŸ ื”-31 ื‘ืื•ืงื˜ื•ื‘ืจ ืœ-1 ื‘ื ื•ื‘ืžื‘ืจ, ื”ืชืงื™ื™ื ื‘ืกื ื˜ ืคื˜ืจืกื‘ื•ืจื’ ื›ื ืก C++ Russia Piter - ืื—ื“ ืžื›ื ืกื™ ื”ืชื›ื ื•ืช ืจื—ื‘ื™ ื”ื”ื™ืงืฃ ื‘ืจื•ืกื™ื”, ืฉืื•ืจื’ืŸ ืขืœ ื™ื“ื™ JUG Ru Group. ื‘ื™ืŸ ื”ื“ื•ื‘ืจื™ื ืฉื”ื•ื–ืžื ื• ื ืžื ื™ื ื—ื‘ืจื™ ื•ืขื“ืช ื”ืชืงื ื™ื ืฉืœ C++, ื“ื•ื‘ืจื™ CppCon, ืžื—ื‘ืจื™ ืกืคืจื™ O'Reilly ื•ืžื ื”ืœื™ ืคืจื•ื™ืงื˜ื™ื ื›ื’ื•ืŸ LLVM, libc++ ื•-Boost. ื”ื›ื ืก ืžื™ื•ืขื“ ืœืžืคืชื—ื™ C++ ืžื ื•ืกื™ื ืฉืจื•ืฆื™ื ืœื”ืขืžื™ืง ืืช ื”ืžื•ืžื—ื™ื•ืช ืฉืœื”ื ื•ืœื”ื—ืœื™ืฃ ื—ื•ื•ื™ื•ืช ื‘ืชืงืฉื•ืจืช ื—ื™ื”. ืกื˜ื•ื“ื ื˜ื™ื, ืกื˜ื•ื“ื ื˜ื™ื ืœืชืืจื™ื ืžืชืงื“ืžื™ื ื•ืžื•ืจื™ื ื‘ืื•ื ื™ื‘ืจืกื™ื˜ืื•ืช ื ื™ืชื ื•ืช ืœื”ื ื—ื•ืช ื™ืคื•ืช ืžืื•ื“.

ืžื”ื“ื•ืจืช ืžื•ืกืงื‘ื” ืฉืœ ื”ื›ื ืก ืชื”ื™ื” ื–ืžื™ื ื” ืœื‘ื™ืงื•ืจ ื›ื‘ืจ ื‘ืืคืจื™ืœ ื‘ืฉื ื” ื”ื‘ืื”, ืื‘ืœ ื‘ื™ื ืชื™ื™ื ื”ืชืœืžื™ื“ื™ื ืฉืœื ื• ื™ืกืคืจื• ืœื›ื ืื™ืœื• ื“ื‘ืจื™ื ืžืขื ื™ื™ื ื™ื ื”ื ืœืžื“ื• ื‘ืื™ืจื•ืข ื”ืื—ืจื•ืŸ. 

C++ ืจื•ืกื™ื”: ืื™ืš ื–ื” ืงืจื”

ืชืžื•ื ื” ืž ืืœื‘ื•ื ื•ืขื™ื“ื”

ืื•ื“ื•ืช

ืฉื ื™ ืกื˜ื•ื“ื ื˜ื™ื ืžื‘ื™ืช ื”ืกืคืจ ื”ื’ื‘ื•ื” ืœื›ืœื›ืœื” ืฉืœ ืื•ื ื™ื‘ืจืกื™ื˜ืช ื”ืžื—ืงืจ ื”ืœืื•ืžื™ - ืกื ื˜ ืคื˜ืจืกื‘ื•ืจื’ ืขื‘ื“ื• ืขืœ ื”ืคื•ืกื˜ ื”ื–ื”:

  • ืœื™ื–ื” ื•ืกื™ืœื ืงื• ื”ื™ื ืกื˜ื•ื“ื ื˜ื™ืช ืฉื ื” ืจื‘ื™ืขื™ืช ืœืชื•ืืจ ืจืืฉื•ืŸ ืฉืœื•ืžื“ืช ืฉืคื•ืช ืชื›ื ื•ืช ื‘ืžืกื’ืจืช ื”ืชื•ื›ื ื™ืช ืœืžืชืžื˜ื™ืงื” ืฉื™ืžื•ืฉื™ืช ื•ืžื“ืขื™ ื”ืžื—ืฉื‘. ืœืื—ืจ ืฉื”ืชื•ื•ื“ืขืชื™ ืœืฉืคืช C++ ื‘ืฉื ื” ื”ืจืืฉื•ื ื” ืฉืœื™ ื‘ืื•ื ื™ื‘ืจืกื™ื˜ื”, ืœืื—ืจ ืžื›ืŸ ืฆื‘ืจืชื™ ื ื™ืกื™ื•ืŸ ื‘ืขื‘ื•ื“ื” ืื™ืชื” ื“ืจืš ื”ืชืžื—ื•ื™ื•ืช ื‘ืชืขืฉื™ื™ื”. ื”ืชืฉื•ืงื” ืฉืœื™ ืœืฉืคื•ืช ืชื›ื ื•ืช ื‘ื›ืœืœ ื•ืœืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื‘ืคืจื˜ ื”ื˜ื‘ื™ืขื” ืืช ื—ื•ืชืžื” ืขืœ ืžื‘ื—ืจ ื”ื“ื•ื—ื•ืช ื‘ื›ื ืก.
  • ื“ื ื™ื” ืกืžื™ืจื ื•ื‘ ื”ื™ื ืกื˜ื•ื“ื ื˜ื™ืช ืฉื ื” ื' ื‘ืชื›ื ื™ืช ืœืชื•ืืจ ืฉื ื™ "ืชื›ื ื•ืช ื•ื ื™ืชื•ื— ื ืชื•ื ื™ื". ืขื•ื“ ื‘ื‘ื™ืช ื”ืกืคืจ, ื›ืชื‘ืชื™ ื‘ืขื™ื•ืช ืื•ืœื™ืžืคื™ืื“ื” ื‘-C++, ื•ืื– ืื™ื›ืฉื”ื• ืงืจื” ืฉื”ืฉืคื” ืขืœืชื” ื›ืœ ื”ื–ืžืŸ ื‘ืคืขื™ืœื•ื™ื•ืช ื—ื™ื ื•ื›ื™ื•ืช ื•ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื”ืคื›ื” ืœืฉืคืช ื”ืขื‘ื•ื“ื” ื”ืขื™ืงืจื™ืช. ื”ื—ืœื˜ืชื™ ืœื”ืฉืชืชืฃ ื‘ื›ื ืก ื›ื“ื™ ืœืฉืคืจ ืืช ื”ื™ื“ืข ืฉืœื™ ื•ื’ื ืœืœืžื•ื“ ืขืœ ื”ื–ื“ืžื ื•ื™ื•ืช ื—ื“ืฉื•ืช.

ื‘ื ื™ื•ื–ืœื˜ืจ, ื”ื ื”ื’ืช ื”ืคืงื•ืœื˜ื” ืžืฉืชืคืช ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืžื™ื“ืข ืขืœ ืื™ืจื•ืขื™ื ื—ื™ื ื•ื›ื™ื™ื ื”ืงืฉื•ืจื™ื ืœืžื•ืžื—ื™ื•ืช ืฉืœื ื•. ื‘ืกืคื˜ืžื‘ืจ ืจืื™ื ื• ืžื™ื“ืข ืขืœ C++ Russia ื•ื”ื—ืœื˜ื ื• ืœื”ื™ืจืฉื ื›ืžืื–ื™ื ื™ื. ื–ื” ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื ื• ื‘ื”ืฉืชืชืคื•ืช ื‘ื›ื ืกื™ื ื›ืืœื”.

ืžื‘ื ื” ื”ื›ื ืก

  • ื“ื™ื•ื•ื—ื™ื

ื‘ืžื”ืœืš ื™ื•ืžื™ื™ื, ืžื•ืžื—ื™ื ืงืจืื• 30 ื“ื•ื—ื•ืช, ื”ืžื›ืกื™ื ื ื•ืฉืื™ื ื—ืžื™ื ืจื‘ื™ื: ืฉื™ืžื•ืฉื™ื ื’ืื•ื ื™ื™ื ื‘ืชื›ื•ื ื•ืช ืฉืคื” ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช ื™ื™ืฉื•ืžื™ื•ืช, ืขื“ื›ื•ื ื™ ืฉืคื” ืงืจื•ื‘ื™ื ื‘ืงืฉืจ ืœืชืงืŸ ื”ื—ื“ืฉ, ืคืฉืจื•ืช ื‘ืขื™ืฆื•ื‘ C++ ื•ืืžืฆืขื™ ื–ื”ื™ืจื•ืช ื‘ืขื‘ื•ื“ื” ืขื ื”ื”ืฉืœื›ื•ืช ืฉืœื”ื, ื“ื•ื’ืžืื•ืช ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจืช ืคืจื•ื™ืงื˜ื™ื ืžืขื ื™ื™ื ืช, ื›ืžื• ื’ื ื›ืžื” ืคืจื˜ื™ื ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข ืฉืœ ืชืฉืชื™ืช ื”ืฉืคื”. ืฉืœื•ืฉ ื”ื•ืคืขื•ืช ื”ืชืงื™ื™ืžื• ื‘ื• ื–ืžื ื™ืช, ืœืจื•ื‘ ืฉืชื™ื™ื ื‘ืจื•ืกื™ืช ื•ืื—ืช ื‘ืื ื’ืœื™ืช.

  • ืื–ื•ืจื™ ื“ื™ื•ืŸ

ืœืื—ืจ ื”ื ืื•ื ื”ื•ืขื‘ืจื• ื›ืœ ื”ืฉืืœื•ืช ืฉืœื ื ืฉืืœื• ื•ื”ื“ื™ื•ื ื™ื ืฉืœื ื”ืกืชื™ื™ืžื• ืœืื–ื•ืจื™ื ื™ื™ืขื•ื“ื™ื™ื ื‘ืžื™ื•ื—ื“ ืœืชืงืฉื•ืจืช ืขื ื”ื“ื•ื‘ืจื™ื, ืžืฆื•ื™ื“ื™ื ื‘ืœื•ื—ื•ืช ืกื™ืžื•ืŸ. ื“ืจืš ื˜ื•ื‘ื” ืœื”ืจื—ื™ืง ืืช ื”ื”ืคืกืงื” ื‘ื™ืŸ ื”ื ืื•ืžื™ื ื‘ืฉื™ื—ื” ื ืขื™ืžื”.

  • ืฉื™ื—ื•ืช ื‘ืจืง ื•ื“ื™ื•ื ื™ื ืœื ืจืฉืžื™ื™ื

ืื ืชืจืฆื• ืœืชืช ื“ื™ื•ื•ื— ืงืฆืจ, ืชื•ื›ืœื• ืœื”ื™ืจืฉื ื‘ืœื•ื— ื”ืœื‘ืŸ ืœืฉื™ื—ืช ื”ื‘ืจืง ื‘ืขืจื‘ ื•ืœืงื‘ืœ ื—ืžืฉ ื“ืงื•ืช ืฉืœ ื–ืžืŸ ืœื“ื‘ืจ ืขืœ ื›ืœ ื“ื‘ืจ ื‘ื ื•ืฉื ื”ื›ื ืก. ืœื“ื•ื’ืžื”, ื”ื™ื›ืจื•ืช ืžื”ื™ืจื” ืขื ื—ื•ืžืจื™ ื—ื™ื˜ื•ื™ ืขื‘ื•ืจ C++ (ืขื‘ื•ืจ ื—ืœืง ื–ื” ื”ื™ื” ื—ื“ืฉ) ืื• ืกื™ืคื•ืจ ืขืœ ื‘ืื’ ื‘ื™ืฆื™ืจืช ื’ืœื™ ืกื™ื ื•ืก ืฉื ื™ืชืŸ ืœืฉืžื•ืข ืืš ืœื ืœืจืื•ืช.

ืคื•ืจืžื˜ ื ื•ืกืฃ ื”ื•ื ื“ื™ื•ืŸ ื”ืคืื ืœ "ืขื ื•ืขื“ืช ืœื‘ ืืœ ืœื‘". ืขืœ ื”ื‘ืžื” ื›ืžื” ืžื—ื‘ืจื™ ื•ืขื“ืช ื”ืชืงื™ื ื”, ืขืœ ื”ืžืงืจืŸ ืื— (ืจืฉืžื™ืช - ื›ื“ื™ ืœื™ืฆื•ืจ ืื•ื•ื™ืจื” ื›ื ื”, ืื‘ืœ ื”ืกื™ื‘ื” "ื›ื™ ื”ื›ืœ ืขื•ืœื” ื‘ืืฉ" ื ืจืื” ืžืฆื—ื™ืง ื™ื•ืชืจ), ืฉืืœื•ืช ืขืœ ื”ืชืงืŸ ื•ื”ื—ื–ื•ืŸ ื”ื›ืœืœื™ ืฉืœ C++ , ื‘ืœื™ ื“ื™ื•ื ื™ื ื˜ื›ื ื™ื™ื ืกื•ืขืจื™ื ื•ื”ื•ืœื™ื•ื•ืจ. ื”ืชื‘ืจืจ ืฉื‘ื•ื•ืขื“ื” ื™ืฉ โ€‹โ€‹ื’ื ืื ืฉื™ื ื—ื™ื™ื ืฉืื•ืœื™ ืœื ื‘ื˜ื•ื—ื™ื ื‘ืžืฉื”ื• ืœื’ืžืจื™ ืื• ืื•ืœื™ ืœื ื™ื•ื“ืขื™ื ืžืฉื”ื•.

ืขื‘ื•ืจ ื—ื•ื‘ื‘ื™ ื”ื”ื•ืœื™ื‘ืจ, ื”ืื™ืจื•ืข ื”ืฉืœื™ืฉื™ ื ืฉืืจ ืขืœ ื”ืžืงืจื” - ืžืคื’ืฉ ื”-BOF "Go vs. C++". ืื ื—ื ื• ืœื•ืงื—ื™ื ื—ื•ื‘ื‘ Go, ื—ื•ื‘ื‘ C++, ืœืคื ื™ ืชื—ื™ืœืช ื”ืžืคื’ืฉ ื”ื ืžื›ื™ื ื™ื ื™ื—ื“ 100500 ืฉืงื•ืคื™ื•ืช ื‘ื ื•ืฉื (ื›ืžื• ื‘ืขื™ื•ืช ื‘ื—ื‘ื™ืœื•ืช ื‘-C++ ืื• ื”ื™ืขื“ืจ ื’ื ืจื™ื•ืช ื‘-Go), ื•ืื– ื”ื ืžื ื”ืœื™ื ื“ื™ื•ืŸ ืขืจ ื‘ื™ื ื ืœื‘ื™ืŸ ืขืฆืžื. ืขื ื”ืงื”ืœ, ื•ื”ืงื”ืœ ืžื ืกื” ืœื”ื‘ื™ืŸ ืฉืชื™ ื ืงื•ื“ื•ืช ืžื‘ื˜ ื‘ื‘ืช ืื—ืช. ืื ื”ื•ืœื™ื‘ืจ ืžืชื—ื™ืœ ืžื—ื•ืฅ ืœื”ืงืฉืจ, ื”ืžื ื—ื” ืžืชืขืจื‘ ื•ืžืคื™ื™ืก ืืช ื”ืฆื“ื“ื™ื. ื”ืคื•ืจืžื˜ ื”ื–ื” ืžืžื›ืจ: ืžืกืคืจ ืฉืขื•ืช ืœืื—ืจ ื”ื”ืชื—ืœื”, ืจืง ืžื—ืฆื™ืช ืžื”ืฉืงื•ืคื™ื•ืช ื”ื•ืฉืœืžื•. ื”ื™ื” ืฆืจื™ืš ืœื”ืื™ืฅ ืžืื•ื“ ืืช ื”ืกื™ื•ื.

  • ืฉื•ืชืฃ ืขื•ืžื“

ืฉื•ืชืคื™ ื”ื›ื ืก ื”ื™ื• ืžื™ื•ืฆื’ื™ื ื‘ืื•ืœืžื•ืช - ื‘ื“ื•ื›ื ื™ื ืฉื•ื—ื—ื• ืขืœ ืคืจื•ื™ืงื˜ื™ื ืฉื•ื˜ืคื™ื, ื”ืฆื™ืขื• ื”ืชืžื—ื•ืช ื•ืชืขืกื•ืงื”, ืขืจื›ื• ื—ื™ื“ื•ื ื™ื ื•ืชื—ืจื•ื™ื•ืช ืงื˜ื ื•ืช ื•ื’ื ื”ื’ืจืœื• ืคืจืกื™ื ื™ืคื™ื. ื™ื—ื“ ืขื ื–ืืช, ื—ืœืง ืžื”ื—ื‘ืจื•ืช ืืฃ ื”ืฆื™ืขื• ืœืขื‘ื•ืจ ืืช ื”ืฉืœื‘ื™ื ื”ืจืืฉื•ื ื™ื™ื ืฉืœ ื”ืจืื™ื•ื ื•ืช, ืžื” ืฉื™ื›ื•ืœ ืœื”ื•ืขื™ืœ ืœืžื™ ืฉื‘ื ืœื ืจืง ืœื”ืื–ื™ืŸ ืœื“ื™ื•ื•ื—ื™ื.

ืคืจื˜ื™ื ื˜ื›ื ื™ื™ื ืฉืœ ื”ื“ื•ื—ื•ืช

ื”ืงืฉื‘ื ื• ืœื“ื™ื•ื•ื—ื™ื ื‘ืฉื ื™ ื”ื™ืžื™ื. ืœืคืขืžื™ื ื”ื™ื” ืงืฉื” ืœื‘ื—ื•ืจ ื“ื•"ื— ืื—ื“ ืžื‘ื™ืŸ ื”ืžืงื‘ื™ืœื™ื - ื”ืกื›ืžื ื• ืœื”ืชืคืฆืœ ื•ืœื”ื—ืœื™ืฃ ืืช ื”ื™ื“ืข ืฉื ืฆื‘ืจ ื‘ื”ืคืกืงื•ืช. ื•ืœืžืจื•ืช ื–ืืช, ื ืจืื” ืฉื”ืจื‘ื” ื ื•ืชืจ ื‘ื—ื•ืฅ. ื›ืืŸ ื‘ืจืฆื•ื ื ื• ืœื“ื‘ืจ ืขืœ ื”ืชื•ื›ืŸ ืฉืœ ื›ืžื” ืžื”ื“ื•ื—ื•ืช ืฉืžืฆืื ื• ื”ื›ื™ ืžืขื ื™ื™ื ื™ื

ื—ืจื™ื’ื™ื ื‘-C++ ื“ืจืš ื”ืคืจื™ื–ืžื” ืฉืœ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืžื”ื“ืจ, Roman Rusyaev

C++ ืจื•ืกื™ื”: ืื™ืš ื–ื” ืงืจื”
ื”ื—ืœืง ืž ืžืฆื’ื•ืช

ื›ืคื™ ืฉื”ื›ื•ืชืจืช ืžืจืžื–ืช, ืจื•ืžืŸ ื”ืกืชื›ืœ ืขืœ ืขื‘ื•ื“ื” ืขื ื—ืจื™ื’ื™ื ื‘ืืžืฆืขื•ืช LLVM ื›ื“ื•ื’ืžื”. ื™ื—ื“ ืขื ื–ืืช, ืขื‘ื•ืจ ืืœื” ืฉืื™ื ื ืžืฉืชืžืฉื™ื ื‘-Clang ื‘ืขื‘ื•ื“ืชื, ื”ื“ื•ื— ืขื“ื™ื™ืŸ ื™ื›ื•ืœ ืœืชืช ืžื•ืฉื’ ื›ืœืฉื”ื• ื›ื™ืฆื“ ื ื™ืชืŸ ืœื‘ืฆืข ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื”ืงื•ื“. ื”ืกื™ื‘ื” ืœื›ืš ื”ื™ื ืฉื”ืžืคืชื—ื™ื ืฉืœ ืžื”ื“ืจื™ื ื•ืกืคืจื™ื•ืช ืกื˜ื ื“ืจื˜ื™ื•ืช ืžืชืื™ืžื•ืช ืžืชืงืฉืจื™ื ื–ื” ืขื ื–ื” ื•ืคืชืจื•ื ื•ืช ืžื•ืฆืœื—ื™ื ืจื‘ื™ื ื™ื›ื•ืœื™ื ืœื—ืคืฃ.

ืœื›ืŸ, ื›ื“ื™ ืœื˜ืคืœ ื‘ื—ืจื™ื’, ืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื”ืจื‘ื” ื“ื‘ืจื™ื: ืœืงืจื•ื ืœืงื•ื“ ื”ื˜ื™ืคื•ืœ (ืื ื™ืฉ) ืื• ืœืžืฉืื‘ื™ื ื‘ื—ื™ื ื ื‘ืจืžื” ื”ื ื•ื›ื—ื™ืช ื•ืœื”ืคื•ืš ืืช ื”ืขืจื™ืžื” ื’ื‘ื•ื” ื™ื•ืชืจ. ื›ืœ ื–ื” ืžื•ื‘ื™ืœ ืœืขื•ื‘ื“ื” ืฉื”ืžื”ื“ืจ ืžื•ืกื™ืฃ ื”ื•ืจืื•ืช ื ื•ืกืคื•ืช ืœืงืจื™ืื•ืช ืฉืขืœื•ืœื•ืช ืœื–ืจื•ืง ื—ืจื™ื’ื™ื. ืœื›ืŸ, ืื ื”ื—ืจื™ื’ ืœื ื™ื•ืขืœื” ื‘ืคื•ืขืœ, ื”ืชื•ื›ื ื™ืช ืขื“ื™ื™ืŸ ืชื‘ืฆืข ืคืขื•ืœื•ืช ืžื™ื•ืชืจื•ืช. ืขืœ ืžื ืช ืœื”ืคื—ื™ืช ืื™ื›ืฉื”ื• ืืช ื”ืชืงื•ืจื”, ืœ-LLVM ื™ืฉ ืžืกืคืจ ื”ื™ื•ืจื™ืกื˜ื™ื•ืช ืœืงื‘ื™ืขืช ืžืฆื‘ื™ื ืฉื‘ื”ื ืื™ืŸ ืฆื•ืจืš ืœื”ื•ืกื™ืฃ ืงื•ื“ ื˜ื™ืคื•ืœ ื‘ื—ืจื™ื’ ืื• ืฉื ื™ืชืŸ ืœื”ืคื—ื™ืช ืืช ืžืกืคืจ ื”ื”ื•ืจืื•ืช ื”"ื ื•ืกืคื•ืช".

ื”ื“ื•ื‘ืจ ื‘ื•ื—ืŸ ื›ืชืจื™ืกืจ ืžื”ื ื•ืžืจืื” ื”ืŸ ืžืฆื‘ื™ื ืฉื‘ื”ื ื”ื ืขื•ื–ืจื™ื ืœื”ืื™ืฅ ืืช ื‘ื™ืฆื•ืข ื”ืชื•ื›ื ื™ืช, ื•ื”ืŸ ืืช ืืœื• ืฉื‘ื”ื ืฉื™ื˜ื•ืช ืืœื• ืื™ื ืŸ ื™ืฉื™ืžื•ืช.

ืœืคื™ื›ืš, Roman Rusyaev ืžื•ื‘ื™ืœ ืืช ื”ืชืœืžื™ื“ื™ื ืœืžืกืงื ื” ืฉืœื ืชืžื™ื“ ื ื™ืชืŸ ืœื‘ืฆืข ืงื•ื“ ื”ืžื›ื™ืœ ื˜ื™ืคื•ืœ ื‘ื—ืจื™ื’ื™ื ืœืœื ืชืงื•ืจื”, ื•ื ื•ืชืŸ ืืช ื”ืขืฆื” ื”ื‘ืื”:

  • ื›ืืฉืจ ืžืคืชื—ื™ื ืกืคืจื™ื•ืช, ื›ื“ืื™ ืœื–ื ื•ื— ื—ืจื™ื’ื™ื ื‘ืื•ืคืŸ ืขืงืจื•ื ื™;
  • ืื ืขื“ื™ื™ืŸ ื™ืฉ ืฆื•ืจืš ื‘ื—ืจื™ื’ื™ื, ืื– ื‘ื›ืœ ืคืขื ืฉืืคืฉืจ ื›ื“ืื™ ืœื”ื•ืกื™ืฃ noexcept (ื•-const) modifiers ื‘ื›ืœ ืžืงื•ื ื›ื“ื™ ืฉื”ืžื”ื“ืจ ื™ื•ื›ืœ ืœื‘ืฆืข ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื›ืžื” ืฉื™ื•ืชืจ.

ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ื“ื•ื‘ืจ ืื™ืฉืจ ืืช ื”ื“ืขื” ืฉืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘ื—ืจื™ื’ื™ื ืœืžื™ื ื™ืžื•ื ืื• ืœื ื˜ื•ืฉ ืื•ืชื ืœื’ืžืจื™.

ืฉืงื•ืคื™ื•ืช ื”ื“ื•ื— ื–ืžื™ื ื•ืช ื‘ืงื™ืฉื•ืจ ื”ื‘ื: ["ื—ืจื™ื’ื™ื ื‘-C++ ื“ืจืš ื”ืขื“ืฉื” ืฉืœ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืžื”ื“ืจ ืฉืœ LLVM"]

ื’ื ืจื˜ื•ืจื™ื, ืงื•ืจื•ื˜ื™ื ื•ืช ื•ืขื•ื“ ืžืชื™ืงื•ืช ืžื’ืœื’ืœืช ืžื•ื—, ืขื“ื™ ืฉื‘ื™ื˜

C++ ืจื•ืกื™ื”: ืื™ืš ื–ื” ืงืจื”
ื”ื—ืœืง ืž ืžืฆื’ื•ืช

ืื—ื“ ืžื”ื“ื™ื•ื•ื—ื™ื ื”ืจื‘ื™ื ื‘ื›ื ืก ื–ื” ืฉื”ื•ืงื“ืฉ ืœื—ื™ื“ื•ืฉื™ื ื‘-C++20 ื”ื™ื” ื‘ืœืชื™ ื ืฉื›ื— ืœื ืจืง ื‘ื–ื›ื•ืช ื”ื”ืฆื’ื” ื”ืฆื‘ืขื•ื ื™ืช ืฉืœื•, ืืœื ื’ื ื‘ื–ื›ื•ืช ื”ื–ื™ื”ื•ื™ ื”ื‘ืจื•ืจ ืฉืœ ื‘ืขื™ื•ืช ืงื™ื™ืžื•ืช ื‘ืœื•ื’ื™ืงืช ืขื™ื‘ื•ื“ ื”ืื™ืกื•ืฃ (ืœืœื•ืœืื”, ื”ืชืงืฉืจื•ืช ื—ื•ื–ืจืช).

ืขื“ื™ ืฉื‘ื™ื˜ ืžื“ื’ื™ืฉื” ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื: ื”ืฉื™ื˜ื•ืช ื”ืงื™ื™ืžื•ืช ื›ื™ื•ื ืขื•ื‘ืจื•ืช ืืช ื›ืœ ื”ืื•ืกืฃ ื•ืื™ื ืŸ ืžืกืคืงื•ืช ื’ื™ืฉื” ืœืžืฆื‘ ื‘ื™ื ื™ื™ื ืคื ื™ืžื™ ื›ืœืฉื”ื• (ืื• ืฉื›ืŸ ื‘ืžืงืจื” ืฉืœ ื”ืชืงืฉืจื•ืช ื—ื•ื–ืจืช, ืืš ืขื ืžืกืคืจ ืจื‘ ืฉืœ ืชื•ืคืขื•ืช ืœื•ื•ืื™ ืœื ื ืขื™ืžื•ืช, ื›ืžื• Callback Hell) . ื ืจืื” ืฉื™ืฉ ืื™ื˜ืจื˜ื•ืจื™ื, ืื‘ืœ ื’ื ืื™ืชื ื”ื›ืœ ืœื ื›ืœ ื›ืš ื—ืœืง: ืื™ืŸ ื ืงื•ื“ื•ืช ื›ื ื™ืกื” ื•ื™ืฆื™ืื” ืžืฉื•ืชืคื•ืช (ื”ืชื—ืœื” โ†’ ืกื•ืฃ ืžื•ืœ rbegin โ†’ rend ื•ื›ืŸ ื”ืœืื”), ืœื ื‘ืจื•ืจ ื›ืžื” ื–ืžืŸ ื ื—ื–ื•ืจ? ื”ื—ืœ ืž-C++20, ื‘ืขื™ื•ืช ืืœื• ื ืคืชืจื•ืช!

ืืคืฉืจื•ืช ืจืืฉื•ื ื”: ื˜ื•ื•ื—ื™ื. ืขืœ ื™ื“ื™ ื’ืœื™ืฉืช ืื™ื˜ืจื˜ื•ืจื™ื, ืื ื• ืžืงื‘ืœื™ื ืžืžืฉืง ืžืฉื•ืชืฃ ืœื”ืชื—ืœื” ื•ืœืกื™ื•ื ืฉืœ ืื™ื˜ืจืฆื™ื”, ื•ืžืงื‘ืœื™ื ื’ื ืืช ื”ื™ื›ื•ืœืช ืœื”ืœื—ื™ืŸ. ื›ืœ ื–ื” ืžืงืœ ืขืœ ื‘ื ื™ื™ืช ืฆื™ื ื•ืจื•ืช ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื ืžืœืื™ื. ืื‘ืœ ืœื ื”ื›ืœ ื›ืœ ื›ืš ื—ืœืง: ื—ืœืง ืžื”ืœื•ื’ื™ืงื” ื”ื—ื™ืฉื•ื‘ื™ืช ืžืžื•ืงื ื‘ืชื•ืš ื”ื™ื™ืฉื•ื ืฉืœ ืื™ื˜ืจื˜ื•ืจ ืกืคืฆื™ืคื™, ืžื” ืฉื™ื›ื•ืœ ืœืกื‘ืš ืืช ื”ืงื•ื“ ืœื”ื‘ื ื” ื•ื ื™ืคื•ื™ ื‘ืื’ื™ื.

C++ ืจื•ืกื™ื”: ืื™ืš ื–ื” ืงืจื”
ื”ื—ืœืง ืž ืžืฆื’ื•ืช

ื•ื‘ื›ืŸ, ืœืžืงืจื” ื–ื”, C++20 ื”ื•ืกื™ืคื• ืงื•ืจื•ื˜ื™ื ื™ื (ืคื•ื ืงืฆื™ื•ืช ืฉื”ืชื ื”ื’ื•ืชืŸ ื“ื•ืžื” ืœืžื—ื•ืœืœื™ื ื‘-Python): ื ื™ืชืŸ ืœื“ื—ื•ืช ืืช ื”ื‘ื™ืฆื•ืข ืขืœ ื™ื“ื™ ื”ื—ื–ืจืช ืขืจืš ื ื•ื›ื—ื™ ื›ืœืฉื”ื• ืชื•ืš ืฉืžื™ืจื” ืขืœ ืžืฆื‘ ื‘ื™ื ื™ื™ื. ืœืคื™ื›ืš, ืื ื• ืžืฉื™ื’ื™ื ืœื ืจืง ืขื‘ื•ื“ื” ืขื ื ืชื•ื ื™ื ื›ืคื™ ืฉื”ื ืžื•ืคื™ืขื™ื, ืืœื ื’ื ืœื›ืœื•ืœ ืืช ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ื‘ืชื•ืš ืงื•ืจื•ื˜ื™ื ื” ืกืคืฆื™ืคื™ืช.

ืื‘ืœ ื™ืฉ ื–ื‘ื•ื‘ ื‘ืžืฉื—ื”: ื›ืจื’ืข ื”ื ื ืชืžื›ื™ื ืจืง ื—ืœืงื™ืช ืขืœ ื™ื“ื™ ืžื”ื“ืจื™ื ืงื™ื™ืžื™ื, ื•ื’ื ืœื ืžื™ื•ืฉืžื™ื ื‘ืฆื•ืจื” ืžืกื•ื“ืจืช ื›ืžื• ืฉื”ื™ื™ื ื• ืจื•ืฆื™ื: ืœืžืฉืœ, ืขื“ื™ื™ืŸ ืœื ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ืจืคืจื ืกื™ื ื•ื‘ืื•ื‘ื™ื™ืงื˜ื™ื ื–ืžื ื™ื™ื ื‘ืงื•ืจื•ื˜ื™ื ื•ืช. ื‘ื ื•ืกืฃ, ื™ืฉ ื›ืžื” ื”ื’ื‘ืœื•ืช ืขืœ ืžื” ืฉื™ื›ื•ืœ ืœื”ื™ื•ืช ืงื•ืจื•ื˜ื™ื ื™ื, ื•ืคื•ื ืงืฆื™ื•ืช constexpr, ื‘ื ืื™ื/ื”ื•ืจืกื™ื ื•-main ืื™ื ื ื›ืœื•ืœื™ื ื‘ืจืฉื™ืžื” ื–ื•.

ืœืคื™ื›ืš, ืงื•ืจื•ื˜ื™ื ื™ื ืคื•ืชืจื™ื ื—ืœืง ื ื›ื‘ื“ ืžื”ื‘ืขื™ื•ืช ื‘ืคืฉื˜ื•ืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืขื™ื‘ื•ื“ ื”ื ืชื•ื ื™ื, ืืš ื”ื™ื™ืฉื•ื ื”ื ื•ื›ื—ื™ ืฉืœื”ื ื“ื•ืจืฉ ืฉื™ืคื•ืจ.

ื—ื•ืžืจื™ื:

C++ ื˜ืจื™ืงื™ื ืž-Yandex.Taxi, Anton Polukhin

ื‘ืคืขื™ืœื•ืช ื”ืžืงืฆื•ืขื™ืช ืฉืœื™, ืœืคืขืžื™ื ืื ื™ ืฆืจื™ืš ืœื™ื™ืฉื ื“ื‘ืจื™ื ืขื–ืจ ื’ืจื™ื“ื: ืžืขื˜ืคืช ื‘ื™ืŸ ื”ืžืžืฉืง ื”ืคื ื™ืžื™ ืœ-API ืฉืœ ืกืคืจื™ื™ื” ื›ืœืฉื”ื™, ืจื™ืฉื•ื ืื• ื ื™ืชื•ื—. ื‘ืžืงืจื” ื–ื”, ื‘ื“ืจืš ื›ืœืœ ืื™ืŸ ืฆื•ืจืš ื‘ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื ื•ืกืคืช. ืื‘ืœ ืžื” ืื ืจื›ื™ื‘ื™ื ืืœื” ืžืฉืžืฉื™ื ื‘ื›ืžื” ืžื”ืฉื™ืจื•ืชื™ื ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ื‘-RuNet? ื‘ืžืฆื‘ ื›ื–ื”, ืชืฆื˜ืจื›ื• ืœืขื‘ื“ ื˜ืจื”-ื‘ื™ื™ื˜ ืœืฉืขื” ืฉืœ ื™ื•ืžื ื™ื ื‘ืœื‘ื“! ื•ืื– ื›ืœ ืืœืคื™ืช ื”ืฉื ื™ื™ื” ื ื—ืฉื‘ืช ื•ืœื›ืŸ ืืชื” ืฆืจื™ืš ืœื ืงื•ื˜ ื‘ื˜ืจื™ืงื™ื ืฉื•ื ื™ื - ืื ื˜ื•ืŸ ืคื•ืœื•ื›ื™ืŸ ื“ื™ื‘ืจ ืขืœื™ื”ื.

ืื•ืœื™ ื”ื“ื•ื’ืžื” ื”ืžืขื ื™ื™ื ืช ื‘ื™ื•ืชืจ ื”ื™ื™ืชื” ื”ื™ื™ืฉื•ื ืฉืœ ืชื‘ื ื™ืช ื”ืžืฆื‘ื™ืข ืœื™ื™ืฉื•ื (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_; 
};

ื”ื‘ืขื™ื” ื”ื™ื—ื™ื“ื”: ืืชื” ืฆืจื™ืš ืœืฆื™ื™ืŸ ืืช ื”ื’ื•ื“ืœ ื•ื”ื™ื™ืฉื•ืจ ืขื‘ื•ืจ ื›ืœ ืขื˜ื™ืคื” - ื‘ื•ืื• ื ืขืฉื” ืืช ืชื‘ื ื™ืช ื”ืคืฆืขื•ื ื™ื ืฉืœื ื• ืขื ืคืจืžื˜ืจื™ื , ื”ืฉืชืžืฉ ื‘ื›ืžื” ืขืจื›ื™ื ืฉืจื™ืจื•ืชื™ื™ื ื•ื”ื•ืกืฃ ื‘ื“ื™ืงื” ืœืžื—ืกืœ ืฉื”ื‘ื ื• ื”ื›ืœ ื ื›ื•ืŸ: 

~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 ืขื ื”ืžื™ืžื•ืฉ, ื•ื’ื ืžืงื‘ืœื™ื ืขื™ืฆื•ื‘ ืฉืžืชืื™ื ื™ื•ืชืจ ืœ-caching ืขืœ ื™ื“ื™ ื”ืžืขื‘ื“.

ืจื™ืฉื•ื ื•ื ื™ืชื•ื— ื ืจืื• ืคื—ื•ืช ืžืจืฉื™ืžื™ื ื•ืœื›ืŸ ืœื ื™ื•ื–ื›ืจื• ื‘ืกืงื™ืจื” ื–ื•.

ืฉืงื•ืคื™ื•ืช ื”ื“ื•ื— ื–ืžื™ื ื•ืช ื‘ืงื™ืฉื•ืจ ื”ื‘ื: ["ื˜ืจื™ืงื™ื ืฉืœ C++ ืžืžื•ื ื™ืช"]

ื˜ื›ื ื™ืงื•ืช ืžื•ื“ืจื ื™ื•ืช ืœืฉืžื™ืจื” ืขืœ ื”ืงื•ื“ ืฉืœืš ื™ื‘ืฉ, Bjรถrn Fahler

ื‘ื”ืจืฆืื” ื–ื•, Bjรถrn Fahler ืžืจืื” ื›ืžื” ื“ืจื›ื™ื ืฉื•ื ื•ืช ืœื”ื™ืœื—ื ื‘ืคื’ื ื”ืกื’ื ื•ื ื™ ืฉืœ ื‘ื“ื™ืงื•ืช ืžืฆื‘ ื—ื•ื–ืจื•ืช ื•ื ืฉื ื•ืช:

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

ื ืฉืžืข ืžื•ื›ืจ? ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘ืžืกืคืจ ื˜ื›ื ื™ืงื•ืช C++ ื—ื–ืงื•ืช ืฉื”ื•ืฆื’ื• ื‘ืชืงื ื™ื ื”ืื—ืจื•ื ื™ื, ืืชื” ื™ื›ื•ืœ ืœื™ื™ืฉื ื‘ืืœื’ื ื˜ื™ื•ืช ืืช ืื•ืชื” ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืœืœื ื›ืœ ืขื•ื ืฉ ื‘ื™ืฆื•ืข. ืœึฐื”ึทืฉืึฐื•ื•ึนืช:   

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

ื›ื“ื™ ืœื˜ืคืœ ื‘ืžืกืคืจ ืœื ืงื‘ื•ืข ืฉืœ ืฆ'ืงื™ื, ืขืœื™ืš ืžื™ื“ ืœื”ืฉืชืžืฉ ื‘ืชื‘ื ื™ื•ืช ื•ืจื™ืื“ื™ื•ืช ื•ื‘ื‘ื™ื˜ื•ื™ื™ ืงื™ืคื•ืœ. ื ื ื™ื— ืฉืื ื• ืจื•ืฆื™ื ืœื‘ื“ื•ืง ืืช ื”ืฉื•ื•ื™ื•ืŸ ืฉืœ ืžืกืคืจ ืžืฉืชื ื™ื ืœืืœืžื ื˜ state_type ืฉืœ ื”-enum. ื”ื“ื‘ืจ ื”ืจืืฉื•ืŸ ืฉืขื•ืœื” ืขืœ ื”ื“ืขืช ื”ื•ื ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื™ืช ืขื•ื–ืจ ื”ื•ื_ื›ืœ_ืžื”:


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);

ื‘ื“ื•ื’ืžื” ื–ื•, ืžื“ืจื™ืš ื”ื ื™ื›ื•ื™ ืžืฉืžืฉ ืœื”ืฆื™ืข ืืช ืคืจืžื˜ืจื™ ืชื‘ื ื™ืช ื”ืžื‘ื ื” ื”ืจืฆื•ื™ื™ื ืœืงื•ืžืคื™ื™ืœืจ, ืืฉืจ ืžื›ื™ืจ ืืช ืกื•ื’ื™ ื”ืืจื’ื•ืžื ื˜ื™ื ืฉืœ ื”ื‘ื ืื™. 

ื‘ื”ืžืฉืš - ื™ื•ืชืจ ืžืขื ื™ื™ืŸ. ื‘ื™ื•ืจืŸ ืžืœืžื“ ื›ื™ืฆื“ ืœื”ื›ืœื™ืœ ืืช ื”ืงื•ื“ ื”ืžืชืงื‘ืœ ืขื‘ื•ืจ ืื•ืคืจื˜ื•ืจื™ ื”ืฉื•ื•ืื” ืžืขื‘ืจ ืœ==, ื•ืœืื—ืจ ืžื›ืŸ ืขื‘ื•ืจ ืคืขื•ืœื•ืช ืฉืจื™ืจื•ืชื™ื•ืช. ืœืื•ืจืš ื”ื“ืจืš, ืชื›ื•ื ื•ืช ื›ื’ื•ืŸ ืชื›ื•ื ืช no_unique_address (C++20) ื•ืคืจืžื˜ืจื™ื ืฉืœ ืชื‘ื ื™ืช ื‘ืคื•ื ืงืฆื™ื•ืช ืœืžื‘ื“ื” (C++20) ืžื•ืกื‘ืจื•ืช ื‘ืืžืฆืขื•ืช ื“ื•ื’ืžืื•ืช ืœืฉื™ืžื•ืฉ. (ื›ืŸ, ืขื›ืฉื™ื• ืงืœ ื™ื•ืชืจ ืœื–ื›ื•ืจ ืืช ืชื—ื‘ื™ืจ ื”ืœืžื‘ื“ื” - ืืœื” ืืจื‘ืขื” ื–ื•ื’ื•ืช ืขื•ืงื‘ื™ื ืฉืœ ืกื•ื’ืจื™ื™ื ืžื›ืœ ื”ืกื•ื’ื™ื.) ื”ืคืชืจื•ืŸ ื”ืกื•ืคื™ ื‘ืืžืฆืขื•ืช ืคื•ื ืงืฆื™ื•ืช ื›ืคืจื˜ื™ ืงื•ื ืกื˜ืจื•ืงื˜ื•ืจ ืžืžืฉ ืžื—ืžื ืืช ื ืฉืžืชื™, ืฉืœื ืœื“ื‘ืจ ืขืœ ื”ื‘ื™ื˜ื•ื™ tuple ื‘ืžื™ื˜ื‘ ื”ืžืกื•ืจื•ืช ืฉืœ ื”ืœืžื‘ื“ื” ื—ึถืฉืึฐื‘ึผื•ึนืŸ.

ื‘ืกื•ืฃ, ืืœ ืชืฉื›ื— ืœืœื˜ืฉ ืื•ืชื•:

  • ื–ื›ื•ืจ ื›ื™ ืœืžื‘ื“ื•ืช ื”ืŸ constexpr ื‘ื—ื™ื ื; 
  • ื‘ื•ืื• ื ื•ืกื™ืฃ ื”ืขื‘ืจื” ืžื•ืฉืœืžืช ื•ื ืกืชื›ืœ ืขืœ ื”ืชื—ื‘ื™ืจ ื”ืžื›ื•ืขืจ ืฉืœื• ื‘ื™ื—ืก ืœื—ื‘ื™ืœืช ื”ืคืจืžื˜ืจื™ื ื‘ืกื’ื™ืจืช ื”ืœืžื‘ื“ื”;
  • ื‘ื•ืื• ื ื™ืชืŸ ืœืžื”ื“ืจ ื”ื–ื“ืžื ื•ื™ื•ืช ื ื•ืกืคื•ืช ืœืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืขื noexcept ืžื•ืชื ื”; 
  • ื‘ื•ืื• ื ื“ืื’ ืœืคืœื˜ ืฉื’ื™ืื•ืช ืžื•ื‘ืŸ ื™ื•ืชืจ ื‘ืชื‘ื ื™ื•ืช ื”ื•ื“ื•ืช ืœืขืจื›ื™ ื”ื—ื–ืจ ืžืคื•ืจืฉื™ื ืฉืœ ืœืžื‘ื“ื•ืช. ื–ื” ื™ืืœืฅ ืืช ื”ืžื”ื“ืจ ืœื‘ืฆืข ื‘ื“ื™ืงื•ืช ื ื•ืกืคื•ืช ืœืคื ื™ ืฉืคื•ื ืงืฆื™ื™ืช ื”ืชื‘ื ื™ืช ืชื™ืงืจื ื‘ืคื•ืขืœ - ื‘ืฉืœื‘ ื‘ื“ื™ืงืช ื”ืกื•ื’. 

ืœืคืจื˜ื™ื ื ื ืœืขื™ื™ืŸ ื‘ื—ื•ืžืจื™ ื”ื”ืจืฆืื”: 

ื”ื”ืชืจืฉืžื•ืช ืฉืœื ื•

ื”ื”ืฉืชืชืคื•ืช ื”ืจืืฉื•ื ื” ืฉืœื ื• ื‘-C++ Russia ื”ื™ื™ืชื” ื‘ืœืชื™ ื ืฉื›ื—ืช ื‘ื–ื›ื•ืช ืขื•ืฆืžืชื”. ื”ืชืจืฉืžืชื™ ืž-C++ Russia ื›ืื™ืจื•ืข ื›ื ื”, ืฉื‘ื• ื”ื’ื‘ื•ืœ ื‘ื™ืŸ ืื™ืžื•ืŸ ืœืชืงืฉื•ืจืช ื—ื™ื” ื›ืžืขื˜ ื•ืœื ืžื•ืจื’ืฉ. ื”ื›ืœ, ืžืžืฆื‘ ื”ืจื•ื— ืฉืœ ื”ื“ื•ื‘ืจื™ื ื•ืขื“ ืœืชื—ืจื•ื™ื•ืช ืฉืœ ื”ืฉื•ืชืคื™ื ืœืื™ืจื•ืข, ืžื•ื‘ื™ืœ ืœื“ื™ื•ื ื™ื ืกื•ืขืจื™ื. ืชื•ื›ืŸ ื”ื›ื ืก, ื”ืžื•ืจื›ื‘ ืžื“ื•ื—ื•ืช, ืžื›ืกื” ืžื’ื•ื•ืŸ ืจื—ื‘ ืœืžื“ื™ ืฉืœ ื ื•ืฉืื™ื ื›ื•ืœืœ ื—ื™ื“ื•ืฉื™ C++, ืชื™ืื•ืจื™ ืžืงืจื” ืฉืœ ืคืจื•ื™ืงื˜ื™ื ื’ื“ื•ืœื™ื ื•ืฉื™ืงื•ืœื™ื ืื“ืจื™ื›ืœื™ื™ื ืื™ื“ื™ืื•ืœื•ื’ื™ื™ื. ืื‘ืœ ื–ื” ื™ื”ื™ื” ืœื ื”ื•ื’ืŸ ืœื”ืชืขืœื ืžื”ืžืจื›ื™ื‘ ื”ื—ื‘ืจืชื™ ืฉืœ ื”ืื™ืจื•ืข, ืฉืขื•ื–ืจ ืœื”ืชื’ื‘ืจ ืขืœ ืžื—ืกื•ืžื™ ืฉืคื” ื‘ื™ื—ืก ืœื ืจืง ืœ-C++.

ืื ื• ืžื•ื“ื™ื ืœืžืืจื’ื ื™ ื”ื›ื ืก ืขืœ ื”ื”ื–ื“ืžื ื•ืช ืœื”ืฉืชืชืฃ ื‘ืื™ืจื•ืข ืฉื›ื–ื”!
ืื•ืœื™ ืจืื™ืชื ืืช ื”ืคื•ืกื˜ ืฉืœ ื”ืžืืจื’ื ื™ื ืขืœ ื”ืขื‘ืจ, ื”ื”ื•ื•ื” ื•ื”ืขืชื™ื“ ืฉืœ C++ Russia ื‘ื‘ืœื•ื’ JUG Ru.

ืชื•ื“ื” ืฉืงืจืืชื, ื•ืื ื• ืžืงื•ื•ื™ื ืฉื”ืกืคืจ ืžื—ื“ืฉ ืฉืœื ื• ืขืœ ืื™ืจื•ืขื™ื ื”ื™ื” ืžื•ืขื™ืœ!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”