ืื ืืชืืืืช ืืืฆืื ืืชื ืืืืจ ืฉืืฉ ืงืื C++ ืชืืื ืขื ืืงืืจ, ืื ืขื ืืกืืฃ ืืื ืืืื ืืืจืืช ืื ืืจืื.
ืืืืจื ื ืฉืืจืืกืืจืืค
ืืื ื-31 ืืืืงืืืืจ ื-1 ืื ืืืืืจ, ืืชืงืืื ืืกื ื ืคืืจืกืืืจื ืื ืก C++ Russia Piter - ืืื ืืื ืกื ืืชืื ืืช ืจืืื ืืืืงืฃ ืืจืืกืื, ืฉืืืจืื ืขื ืืื JUG Ru Group. ืืื ืืืืืจืื ืฉืืืืื ื ื ืื ืื ืืืจื ืืขืืช ืืชืงื ืื ืฉื C++, ืืืืจื CppCon, ืืืืจื ืกืคืจื O'Reilly ืืื ืืื ืคืจืืืงืืื ืืืื LLVM, libc++ ื-Boost. ืืื ืก ืืืืขื ืืืคืชืื C++ ืื ืืกืื ืฉืจืืฆืื ืืืขืืืง ืืช ืืืืืืืืช ืฉืืื ืืืืืืืฃ ืืืืืืช ืืชืงืฉืืจืช ืืื. ืกืืืื ืืื, ืกืืืื ืืื ืืชืืจืื ืืชืงืืืื ืืืืจืื ืืืื ืืืจืกืืืืืช ื ืืชื ืืช ืืื ืืืช ืืคืืช ืืืื.
ืืืืืจืช ืืืกืงืื ืฉื ืืื ืก ืชืืื ืืืื ื ืืืืงืืจ ืืืจ ืืืคืจืื ืืฉื ื ืืืื, ืืื ืืื ืชืืื ืืชืืืืืื ืฉืื ื ืืกืคืจื ืืื ืืืื ืืืจืื ืืขื ืืื ืื ืื ืืืื ืืืืจืืข ืืืืจืื.
ืชืืื ื ื
ืืืืืช
ืฉื ื ืกืืืื ืืื ืืืืช ืืกืคืจ ืืืืื ืืืืืื ืฉื ืืื ืืืจืกืืืช ืืืืงืจ ืืืืืื - ืกื ื ืคืืจืกืืืจื ืขืืื ืขื ืืคืืกื ืืื:
- ืืืื ืืกืืื ืงื ืืื ืกืืืื ืืืช ืฉื ื ืจืืืขืืช ืืชืืืจ ืจืืฉืื ืฉืืืืืช ืฉืคืืช ืชืื ืืช ืืืกืืจืช ืืชืืื ืืช ืืืชืืืืงื ืฉืืืืฉืืช ืืืืขื ืืืืฉื. ืืืืจ ืฉืืชืืืืขืชื ืืฉืคืช C++ ืืฉื ื ืืจืืฉืื ื ืฉืื ืืืื ืืืจืกืืื, ืืืืจ ืืื ืฆืืจืชื ื ืืกืืื ืืขืืืื ืืืชื ืืจื ืืชืืืืืืช ืืชืขืฉืืื. ืืชืฉืืงื ืฉืื ืืฉืคืืช ืชืื ืืช ืืืื ืืืชืื ืืช ืคืื ืงืฆืืื ืืืืช ืืคืจื ืืืืืขื ืืช ืืืชืื ืขื ืืืืจ ืืืืืืช ืืื ืก.
- ืื ืื ืกืืืจื ืื ืืื ืกืืืื ืืืช ืฉื ื ื' ืืชืื ืืช ืืชืืืจ ืฉื ื "ืชืื ืืช ืื ืืชืื ื ืชืื ืื". ืขืื ืืืืช ืืกืคืจ, ืืชืืชื ืืขืืืช ืืืืืืคืืืื ื-C++, ืืื ืืืืฉืื ืงืจื ืฉืืฉืคื ืขืืชื ืื ืืืื ืืคืขืืืืืืช ืืื ืืืืืช ืืืกืืคื ืฉื ืืืจ ืืคืื ืืฉืคืช ืืขืืืื ืืขืืงืจืืช. ืืืืืชื ืืืฉืชืชืฃ ืืื ืก ืืื ืืฉืคืจ ืืช ืืืืข ืฉืื ืืื ืืืืื ืขื ืืืืื ืืืืช ืืืฉืืช.
ืื ืืืืืืจ, ืื ืืืช ืืคืงืืืื ืืฉืชืคืช ืืขืชืื ืงืจืืืืช ืืืืข ืขื ืืืจืืขืื ืืื ืืืืื ืืงืฉืืจืื ืืืืืืืืช ืฉืื ื. ืืกืคืืืืจ ืจืืื ื ืืืืข ืขื C++ Russia ืืืืืื ื ืืืืจืฉื ืืืืืื ืื. ืื ืื ืืกืืื ืืจืืฉืื ืฉืื ื ืืืฉืชืชืคืืช ืืื ืกืื ืืืื.
ืืื ื ืืื ืก
-
ืืืืืืื
ืืืืื ืืืืืื, ืืืืืื ืงืจืื 30 ืืืืืช, ืืืืกืื ื ืืฉืืื ืืืื ืจืืื: ืฉืืืืฉืื ืืืื ืืื ืืชืืื ืืช ืฉืคื ืืคืชืจืื ืืขืืืช ืืืฉืืืืืช, ืขืืืื ื ืฉืคื ืงืจืืืื ืืงืฉืจ ืืชืงื ืืืืฉ, ืคืฉืจืืช ืืขืืฆืื C++ ืืืืฆืขื ืืืืจืืช ืืขืืืื ืขื ืืืฉืืืืช ืฉืืื, ืืืืืืืช ืฉื ืืจืืืืงืืืจืช ืคืจืืืงืืื ืืขื ืืื ืช, ืืื ืื ืืื ืคืจืืื ืืชืืช ืืืืกื ืืื ืืข ืฉื ืชืฉืชืืช ืืฉืคื. ืฉืืืฉ ืืืคืขืืช ืืชืงืืืื ืื ืืื ืืช, ืืจืื ืฉืชืืื ืืจืืกืืช ืืืืช ืืื ืืืืช.
-
ืืืืจื ืืืื
ืืืืจ ืื ืืื ืืืขืืจื ืื ืืฉืืืืช ืฉืื ื ืฉืืื ืืืืืื ืื ืฉืื ืืกืชืืืื ืืืืืจืื ืืืขืืืืื ืืืืืื ืืชืงืฉืืจืช ืขื ืืืืืจืื, ืืฆืืืืื ืืืืืืช ืกืืืื. ืืจื ืืืื ืืืจืืืง ืืช ืืืคืกืงื ืืื ืื ืืืืื ืืฉืืื ื ืขืืื.
-
ืฉืืืืช ืืจืง ืืืืื ืื ืื ืจืฉืืืื
ืื ืชืจืฆื ืืชืช ืืืืื ืงืฆืจ, ืชืืืื ืืืืจืฉื ืืืื ืืืื ืืฉืืืช ืืืจืง ืืขืจื ืืืงืื ืืืฉ ืืงืืช ืฉื ืืื ืืืืจ ืขื ืื ืืืจ ืื ืืฉื ืืื ืก. ืืืืืื, ืืืืจืืช ืืืืจื ืขื ืืืืจื ืืืืื ืขืืืจ C++ (ืขืืืจ ืืืง ืื ืืื ืืืฉ) ืื ืกืืคืืจ ืขื ืืื ืืืฆืืจืช ืืื ืกืื ืืก ืฉื ืืชื ืืฉืืืข ืื ืื ืืจืืืช.
ืคืืจืื ื ืืกืฃ ืืื ืืืื ืืคืื ื "ืขื ืืขืืช ืื ืื ืื". ืขื ืืืื ืืื ืืืืจื ืืขืืช ืืชืงืื ื, ืขื ืืืงืจื ืื (ืจืฉืืืช - ืืื ืืืฆืืจ ืืืืืจื ืื ื, ืืื ืืกืืื "ืื ืืื ืขืืื ืืืฉ" ื ืจืื ืืฆืืืง ืืืชืจ), ืฉืืืืช ืขื ืืชืงื ืืืืืื ืืืืื ืฉื C++ , ืืื ืืืื ืื ืืื ืืื ืกืืขืจืื ืืืืืืืืจ. ืืชืืจืจ ืฉืืืืขืื ืืฉ โโืื ืื ืฉืื ืืืื ืฉืืืื ืื ืืืืืื ืืืฉืื ืืืืจื ืื ืืืื ืื ืืืืขืื ืืฉืื.
ืขืืืจ ืืืืื ืืืืืืืจ, ืืืืจืืข ืืฉืืืฉื ื ืฉืืจ ืขื ืืืงืจื - ืืคืืฉ ื-BOF "Go vs. C++". ืื ืื ื ืืืงืืื ืืืื Go, ืืืื C++, ืืคื ื ืชืืืืช ืืืคืืฉ ืื ืืืื ืื ืืื 100500 ืฉืงืืคืืืช ืื ืืฉื (ืืื ืืขืืืช ืืืืืืืช ื-C++ ืื ืืืขืืจ ืื ืจืืืช ื-Go), ืืื ืื ืื ืืืื ืืืื ืขืจ ืืื ื ืืืื ืขืฆืื. ืขื ืืงืื, ืืืงืื ืื ืกื ืืืืื ืฉืชื ื ืงืืืืช ืืื ืืืช ืืืช. ืื ืืืืืืจ ืืชืืื ืืืืฅ ืืืงืฉืจ, ืืื ืื ืืชืขืจื ืืืคืืืก ืืช ืืฆืืืื. ืืคืืจืื ืืื ืืืืจ: ืืกืคืจ ืฉืขืืช ืืืืจ ืืืชืืื, ืจืง ืืืฆืืช ืืืฉืงืืคืืืช ืืืฉืืื. ืืื ืฆืจืื ืืืืืฅ ืืืื ืืช ืืกืืื.
-
ืฉืืชืฃ ืขืืื
ืฉืืชืคื ืืื ืก ืืื ืืืืฆืืื ืืืืืืืช - ืืืืื ืื ืฉืืืื ืขื ืคืจืืืงืืื ืฉืืืคืื, ืืฆืืขื ืืชืืืืช ืืชืขืกืืงื, ืขืจืื ืืืืื ืื ืืชืืจืืืืช ืงืื ืืช ืืื ืืืจืื ืคืจืกืื ืืคืื. ืืื ืขื ืืืช, ืืืง ืืืืืจืืช ืืฃ ืืฆืืขื ืืขืืืจ ืืช ืืฉืืืื ืืจืืฉืื ืืื ืฉื ืืจืืืื ืืช, ืื ืฉืืืื ืืืืขืื ืืื ืฉืื ืื ืจืง ืืืืืื ืืืืืืืื.
ืคืจืืื ืืื ืืื ืฉื ืืืืืืช
ืืงืฉืื ื ืืืืืืืื ืืฉื ื ืืืืื. ืืคืขืืื ืืื ืงืฉื ืืืืืจ ืื"ื ืืื ืืืื ืืืงืืืืื - ืืกืืื ื ืืืชืคืฆื ืืืืืืืฃ ืืช ืืืืข ืฉื ืฆืืจ ืืืคืกืงืืช. ืืืืจืืช ืืืช, ื ืจืื ืฉืืจืื ื ืืชืจ ืืืืฅ. ืืื ืืจืฆืื ื ื ืืืืจ ืขื ืืชืืื ืฉื ืืื ืืืืืืืช ืฉืืฆืื ื ืืื ืืขื ืืื ืื
ืืจืืืื ื-C++ ืืจื ืืคืจืืืื ืฉื ืืืคืืืืืืฆืืืช ืืืืจ, Roman Rusyaev
ืืืืง ื
ืืคื ืฉืืืืชืจืช ืืจืืืช, ืจืืื ืืกืชืื ืขื ืขืืืื ืขื ืืจืืืื ืืืืฆืขืืช LLVM ืืืืืื. ืืื ืขื ืืืช, ืขืืืจ ืืื ืฉืืื ื ืืฉืชืืฉืื ื-Clang ืืขืืืืชื, ืืืื ืขืืืื ืืืื ืืชืช ืืืฉื ืืืฉืื ืืืฆื ื ืืชื ืืืฆืข ืืืคืืืืืืฆืื ืฉื ืืงืื. ืืกืืื ืืื ืืื ืฉืืืคืชืืื ืฉื ืืืืจืื ืืกืคืจืืืช ืกืื ืืจืืืืช ืืชืืืืืช ืืชืงืฉืจืื ืื ืขื ืื ืืคืชืจืื ืืช ืืืฆืืืื ืจืืื ืืืืืื ืืืคืฃ.
ืืื, ืืื ืืืคื ืืืจืื, ืืชื ืฆืจืื ืืขืฉืืช ืืจืื ืืืจืื: ืืงืจืื ืืงืื ืืืืคืื (ืื ืืฉ) ืื ืืืฉืืืื ืืืื ื ืืจืื ืื ืืืืืช ืืืืคืื ืืช ืืขืจืืื ืืืื ืืืชืจ. ืื ืื ืืืืื ืืขืืืื ืฉืืืืืจ ืืืกืืฃ ืืืจืืืช ื ืืกืคืืช ืืงืจืืืืช ืฉืขืืืืืช ืืืจืืง ืืจืืืื. ืืื, ืื ืืืจืื ืื ืืืขืื ืืคืืขื, ืืชืืื ืืช ืขืืืื ืชืืฆืข ืคืขืืืืช ืืืืชืจืืช. ืขื ืื ืช ืืืคืืืช ืืืืฉืื ืืช ืืชืงืืจื, ื-LLVM ืืฉ ืืกืคืจ ืืืืจืืกืืืืช ืืงืืืขืช ืืฆืืื ืฉืืื ืืื ืฆืืจื ืืืืกืืฃ ืงืื ืืืคืื ืืืจืื ืื ืฉื ืืชื ืืืคืืืช ืืช ืืกืคืจ ืืืืจืืืช ื"ื ืืกืคืืช".
ืืืืืจ ืืืื ืืชืจืืกืจ ืืื ืืืจืื ืื ืืฆืืื ืฉืืื ืื ืขืืืจืื ืืืืืฅ ืืช ืืืฆืืข ืืชืืื ืืช, ืืื ืืช ืืื ืฉืืื ืฉืืืืช ืืื ืืื ื ืืฉืืืืช.
ืืคืืื, Roman Rusyaev ืืืืื ืืช ืืชืืืืืื ืืืกืงื ื ืฉืื ืชืืื ื ืืชื ืืืฆืข ืงืื ืืืืื ืืืคืื ืืืจืืืื ืืื ืชืงืืจื, ืื ืืชื ืืช ืืขืฆื ืืืื:
- ืืืฉืจ ืืคืชืืื ืกืคืจืืืช, ืืืื ืืื ืื ืืจืืืื ืืืืคื ืขืงืจืื ื;
- ืื ืขืืืื ืืฉ ืฆืืจื ืืืจืืืื, ืื ืืื ืคืขื ืฉืืคืฉืจ ืืืื ืืืืกืืฃ noexcept (ื-const) modifiers ืืื ืืงืื ืืื ืฉืืืืืจ ืืืื ืืืฆืข ืืืคืืืืืืฆืื ืืื ืฉืืืชืจ.
ืืืืคื ืืืื, ืืืืืจ ืืืฉืจ ืืช ืืืขื ืฉืขืืืฃ ืืืฉืชืืฉ ืืืจืืืื ืืืื ืืืื ืื ืื ืืืฉ ืืืชื ืืืืจื.
ืฉืงืืคืืืช ืืืื ืืืื ืืช ืืงืืฉืืจ ืืื:
ืื ืจืืืจืื, ืงืืจืืืื ืืช ืืขืื ืืชืืงืืช ืืืืืืช ืืื, ืขืื ืฉืืื
ืืืืง ื
ืืื ืืืืืืืืื ืืจืืื ืืื ืก ืื ืฉืืืงืืฉ ืืืืืืฉืื ื-C++20 ืืื ืืืชื ื ืฉืื ืื ืจืง ืืืืืช ืืืฆืื ืืฆืืขืื ืืช ืฉืื, ืืื ืื ืืืืืช ืืืืืื ืืืจืืจ ืฉื ืืขืืืช ืงืืืืืช ืืืืืืงืช ืขืืืื ืืืืกืืฃ (ืืืืืื, ืืชืงืฉืจืืช ืืืืจืช).
ืขืื ืฉืืื ืืืืืฉื ืืช ืืืืจืื ืืืืื: ืืฉืืืืช ืืงืืืืืช ืืืื ืขืืืจืืช ืืช ืื ืืืืกืฃ ืืืื ื ืืกืคืงืืช ืืืฉื ืืืฆื ืืื ืืื ืคื ืืื ืืืฉืื (ืื ืฉืื ืืืงืจื ืฉื ืืชืงืฉืจืืช ืืืืจืช, ืื ืขื ืืกืคืจ ืจื ืฉื ืชืืคืขืืช ืืืืื ืื ื ืขืืืืช, ืืื Callback Hell) . ื ืจืื ืฉืืฉ ืืืืจืืืจืื, ืืื ืื ืืืชื ืืื ืื ืื ืื ืืืง: ืืื ื ืงืืืืช ืื ืืกื ืืืฆืืื ืืฉืืชืคืืช (ืืชืืื โ ืกืืฃ ืืื rbegin โ rend ืืื ืืืื), ืื ืืจืืจ ืืื ืืื ื ืืืืจ? ืืื ื-C++20, ืืขืืืช ืืื ื ืคืชืจืืช!
ืืคืฉืจืืช ืจืืฉืื ื: ืืืืืื. ืขื ืืื ืืืืฉืช ืืืืจืืืจืื, ืื ื ืืงืืืื ืืืฉืง ืืฉืืชืฃ ืืืชืืื ืืืกืืื ืฉื ืืืืจืฆืื, ืืืงืืืื ืื ืืช ืืืืืืช ืืืืืื. ืื ืื ืืงื ืขื ืื ืืืช ืฆืื ืืจืืช ืขืืืื ื ืชืื ืื ืืืืื. ืืื ืื ืืื ืื ืื ืืืง: ืืืง ืืืืืืืงื ืืืืฉืืืืช ืืืืงื ืืชืื ืืืืฉืื ืฉื ืืืืจืืืจ ืกืคืฆืืคื, ืื ืฉืืืื ืืกืื ืืช ืืงืื ืืืื ื ืื ืืคืื ืืืืื.
ืืืืง ื
ืืืื, ืืืงืจื ืื, C++20 ืืืกืืคื ืงืืจืืืื ืื (ืคืื ืงืฆืืืช ืฉืืชื ืืืืชื ืืืื ืืืืืืืื ื-Python): ื ืืชื ืืืืืช ืืช ืืืืฆืืข ืขื ืืื ืืืืจืช ืขืจื ื ืืืื ืืืฉืื ืชืื ืฉืืืจื ืขื ืืฆื ืืื ืืื. ืืคืืื, ืื ื ืืฉืืืื ืื ืจืง ืขืืืื ืขื ื ืชืื ืื ืืคื ืฉืื ืืืคืืขืื, ืืื ืื ืืืืื ืืช ืื ืืืืืืื ืืชืื ืงืืจืืืื ื ืกืคืฆืืคืืช.
ืืื ืืฉ ืืืื ืืืฉืื: ืืจืืข ืื ื ืชืืืื ืจืง ืืืงืืช ืขื ืืื ืืืืจืื ืงืืืืื, ืืื ืื ืืืืฉืืื ืืฆืืจื ืืกืืืจืช ืืื ืฉืืืื ื ืจืืฆืื: ืืืฉื, ืขืืืื ืื ืืืื ืืืฉืชืืฉ ืืจืคืจื ืกืื ืืืืืืืืงืืื ืืื ืืื ืืงืืจืืืื ืืช. ืื ืืกืฃ, ืืฉ ืืื ืืืืืืช ืขื ืื ืฉืืืื ืืืืืช ืงืืจืืืื ืื, ืืคืื ืงืฆืืืช constexpr, ืื ืืื/ืืืจืกืื ื-main ืืื ื ืืืืืื ืืจืฉืืื ืื.
ืืคืืื, ืงืืจืืืื ืื ืคืืชืจืื ืืืง ื ืืื ืืืืขืืืช ืืคืฉืืืช ืืืืืืื ืฉื ืขืืืื ืื ืชืื ืื, ืื ืืืืฉืื ืื ืืืื ืฉืืื ืืืจืฉ ืฉืืคืืจ.
ืืืืจืื:
- ืฉืงืืคืืืช ื-C++ ืจืืกืื -
["ืื ืจืืืจืื, ืงืืจืืืื ืื ืืขืื ืืชืืงืืช ืืืืืืช ืืื"] ืืงืืืช ืืืืื ืฉื ืืื"ื ื-CppCon 2019
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 ืขื ืืื ืืืขืื.
ืจืืฉืื ืื ืืชืื ื ืจืื ืคืืืช ืืจืฉืืืื ืืืื ืื ืืืืืจื ืืกืงืืจื ืื.
ืฉืงืืคืืืช ืืืื ืืืื ืืช ืืงืืฉืืจ ืืื:
ืืื ืืงืืช ืืืืจื ืืืช ืืฉืืืจื ืขื ืืงืื ืฉืื ืืืฉ, 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 ืืืชื ื;
- ืืืื ื ืืื ืืคืื ืฉืืืืืช ืืืื ืืืชืจ ืืชืื ืืืช ืืืืืช ืืขืจืื ืืืืจ ืืคืืจืฉืื ืฉื ืืืืืืช. ืื ืืืืฅ ืืช ืืืืืจ ืืืฆืข ืืืืงืืช ื ืืกืคืืช ืืคื ื ืฉืคืื ืงืฆืืืช ืืชืื ืืช ืชืืงืจื ืืคืืขื - ืืฉืื ืืืืงืช ืืกืื.
ืืคืจืืื ื ื ืืขืืื ืืืืืจื ืืืจืฆืื:
- ืืืื ืขื ืฉืงืืคืืืช:
[ืืื ืืงืืช ืืืืจื ืืืช ืืฉืืืจื ืขื ืืงืื ืฉืื ืืืฉ] ืงืื ืืงืืจ ื-github ืืืืจ ืืืืื ืฉื ืืืืืจ
ืืืชืจืฉืืืช ืฉืื ื
ืืืฉืชืชืคืืช ืืจืืฉืื ื ืฉืื ื ื-C++ Russia ืืืืชื ืืืชื ื ืฉืืืช ืืืืืช ืขืืฆืืชื. ืืชืจืฉืืชื ื-C++ Russia ืืืืจืืข ืื ื, ืฉืื ืืืืื ืืื ืืืืื ืืชืงืฉืืจืช ืืื ืืืขื ืืื ืืืจืืฉ. ืืื, ืืืฆื ืืจืื ืฉื ืืืืืจืื ืืขื ืืชืืจืืืืช ืฉื ืืฉืืชืคืื ืืืืจืืข, ืืืืื ืืืืื ืื ืกืืขืจืื. ืชืืื ืืื ืก, ืืืืจืื ืืืืืืช, ืืืกื ืืืืื ืจืื ืืืื ืฉื ื ืืฉืืื ืืืื ืืืืืฉื C++, ืชืืืืจื ืืงืจื ืฉื ืคืจืืืงืืื ืืืืืื ืืฉืืงืืืื ืืืจืืืืืื ืืืืืืืืืืืื. ืืื ืื ืืืื ืื ืืืื ืืืชืขืื ืืืืจืืื ืืืืจืชื ืฉื ืืืืจืืข, ืฉืขืืืจ ืืืชืืืจ ืขื ืืืกืืื ืฉืคื ืืืืก ืื ืจืง ื-C++.
ืื ื ืืืืื ืืืืจืื ื ืืื ืก ืขื ืืืืืื ืืช ืืืฉืชืชืฃ ืืืืจืืข ืฉืืื!
ืืืื ืจืืืชื ืืช ืืคืืกื ืฉื ืืืืจืื ืื ืขื ืืขืืจ, ืืืืื ืืืขืชืื ืฉื C++ Russia
ืชืืื ืฉืงืจืืชื, ืืื ื ืืงืืืื ืฉืืกืคืจ ืืืืฉ ืฉืื ื ืขื ืืืจืืขืื ืืื ืืืขืื!
ืืงืืจ: www.habr.com