C++ เชฐเชถเชฟเชฏเชพ: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชฏเซเช‚

เชœเซ‹ เชจเชพเชŸเช•เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชคเชฎเซ‡ เช•เชนเซ‹ เช•เซ‡ เชฆเชฟเชตเชพเชฒ เชชเชฐ C++ เช•เซ‹เชก เชฒเชŸเช•เชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชคเซ‹ เช…เช‚เชค เชธเซเชงเซ€เชฎเชพเช‚ เชคเซ‡ เชคเชฎเชจเซ‡ เชชเช—เชฎเชพเช‚ เชฎเชพเชฐเชถเซ‡.

Bjarne Stroustrup

เช‘เช•เซเชŸเซ‹เชฌเชฐ 31 เชฅเซ€ เชจเชตเซ‡เชฎเซเชฌเชฐ 1 เชธเซเชงเซ€, เชธเซ‡เชจเซเชŸ เชชเซ€เชŸเชฐเซเชธเชฌเชฐเซเช—เชฎเชพเช‚ C++ เชฐเชถเชฟเชฏเชพ เชชเชฟเชŸเชฐ เช•เซ‹เชจเซเชซเชฐเชจเซเชธ เชฏเซ‹เชœเชพเชˆ เชนเชคเซ€ - เชœเซ‡ เชฐเชถเชฟเชฏเชพเชฎเชพเช‚ เชฎเซ‹เชŸเชพ เชชเชพเชฏเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชฎเชพเช‚เชจเซ€ เชเช•, เชœเซ‡เชฏเซเชœเซ€ เชฐเซ‚ เช—เซเชฐเซเชช เชฆเซเชตเชพเชฐเชพ เช†เชฏเซ‹เชœเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เช†เชฎเช‚เชคเซเชฐเชฟเชค เชตเช•เซเชคเชพเช“เชฎเชพเช‚ C++ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก เช•เชฎเชฟเชŸเซ€เชจเชพ เชธเชญเซเชฏเซ‹, CppCon เชธเซเชชเซ€เช•เชฐเซเชธ, O'Reilly เชชเซเชธเซเชคเช•เชจเชพ เชฒเซ‡เช–เช•เซ‹ เช…เชจเซ‡ LLVM, libc++ เช…เชจเซ‡ เชฌเซ‚เชธเซเชŸ เชœเซ‡เชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชœเชพเชณเชตเชฃเซ€เช•เชพเชฐเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชจเซ‹ เช‰เชฆเซเชฆเซ‡เชถเซเชฏ เช…เชจเซเชญเชตเซ€ C++ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เช›เซ‡ เชœเซ‡เช“ เชคเซ‡เชฎเชจเซ€ เช•เซเชถเชณเชคเชพเชจเซ‡ เชตเชงเซ เชŠเช‚เชกเซเช‚ เช•เชฐเชตเชพ เช…เชจเซ‡ เชฒเชพเช‡เชต เช•เซ‹เชฎเซเชฏเซเชจเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เช…เชจเซเชญเชตเซ‹เชจเซ€ เช†เชช-เชฒเซ‡ เช•เชฐเชตเชพ เชฎเชพเช—เซ‡ เช›เซ‡. เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“, เชธเซเชจเชพเชคเช• เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“ เช…เชจเซ‡ เชฏเซเชจเชฟเชตเชฐเซเชธเชฟเชŸเซ€เชจเชพ เชถเชฟเช•เซเชทเช•เซ‹เชจเซ‡ เช–เซ‚เชฌ เชœ เชธเชฐเชธ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชจเซ€ เชฎเซ‹เชธเซเช•เซ‹ เช†เชตเซƒเชคเซเชคเชฟ เช†เชตเชคเชพ เชตเชฐเซเชทเซ‡ เชเชชเซเชฐเชฟเชฒเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เชนเชถเซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช…เชฎเชพเชฐเชพ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“ เชคเชฎเชจเซ‡ เชœเชฃเชพเชตเชถเซ‡ เช•เซ‡ เช›เซ‡เชฒเซเชฒเซ€ เช‡เชตเซ‡เชจเซเชŸเชฎเชพเช‚ เชคเซ‡เช“เช เช•เชˆ เชฐเชธเชชเซเชฐเชฆ เชฌเชพเชฌเชคเซ‹ เชถเซ€เช–เซ€. 

C++ เชฐเชถเชฟเชฏเชพ: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชฏเซเช‚

เชฎเชพเช‚เชฅเซ€ เชซเซ‹เชŸเซ‹ เช•เซ‹เชจเซเชซเชฐเชจเซเชธ เช†เชฒเซเชฌเชฎ

เช”เช‚เชธ

เชจเซ‡เชถเชจเชฒ เชฐเชฟเชธเชฐเซเชš เชฏเซเชจเชฟเชตเชฐเซเชธเชฟเชŸเซ€ เชนเชพเชฏเชฐ เชธเซเช•เซ‚เชฒ เช“เชซ เชˆเช•เซ‹เชจเซ‹เชฎเชฟเช•เซเชธ - เชธเซ‡เชจเซเชŸ เชชเซ€เชŸเชฐเซเชธเชฌเชฐเซเช—เชจเชพ เชฌเซ‡ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“เช เช† เชชเซ‹เชธเซเชŸ เชชเชฐ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚:

  • เชฒเชฟเชเชพ เชตเชพเชธเชฟเชฒเซ‡เชจเซเช•เซ‹ เชเชชเซเชฒเชพเช‡เชก เชฎเซ‡เชฅเซ‡เชฎเซ‡เชŸเชฟเช•เซเชธ เช…เชจเซ‡ เช•เซ‹เชฎเซเชชเซเชฏเซเชŸเชฐ เชธเชพเชฏเชจเซเชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชญเชพเช—เชฐเซ‚เชชเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฒเซ‡เช‚เช—เซเชตเซ‡เชœเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชคเซ€ 4เช เซเช เซ€ เชตเชฐเซเชทเชจเซ€ เช…เช‚เชกเชฐเช—เซเชฐเซ‡เชœเซเชฏเซเชเชŸ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€ เช›เซ‡. เชฏเซเชจเชฟเชตเชฐเซเชธเชฟเชŸเซ€เชฎเชพเช‚ เชฎเชพเชฐเชพ เชชเซเชฐเชฅเชฎ เชตเชฐเซเชทเชฎเชพเช‚ C++ เชญเชพเชทเชพ เชธเชพเชฅเซ‡ เชชเชฐเชฟเชšเชฟเชค เชฅเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เช‰เชฆเซเชฏเซ‹เช—เชฎเชพเช‚ เช‡เชจเซเชŸเชฐเซเชจเชถเซ€เชช เชฆเซเชตเชพเชฐเชพ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ‹ เช…เชจเซเชญเชต เชฎเซ‡เชณเชตเซเชฏเซ‹. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“ เช…เชจเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฎเชพเชŸเซ‡เชจเชพ เชฎเชพเชฐเชพ เชœเซเชธเซเชธเชพเช เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชฎเชพเช‚ เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเซ€ เชชเชธเช‚เชฆเช—เซ€ เชชเชฐ เชคเซ‡เชจเซ€ เช›เชพเชช เช›เซ‹เชกเซ€ เชฆเซ€เชงเซ€.
  • เชกเชพเชจเซเชฏเชพ เชธเซเชฎเชฟเชฐเซเชจเซ‹เชต เชฎเชพเชธเซเชŸเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ โ€œเชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช…เชจเซ‡ เชกเซ‡เชŸเชพ เชเชจเชพเชฒเชฟเชธเชฟเชธโ€ เชจเซ€ 1เชฒเซ€ เชตเชฐเซเชทเชจเซ€ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เชจเซ€ เช›เซ‡. เชถเชพเชณเชพเชฎเชพเช‚ เชœ เชนเชคเซ‹ เชคเซเชฏเชพเชฐเซ‡, เชฎเซ‡เช‚ C++ เชฎเชพเช‚ เช“เชฒเชฟเชฎเซเชชเชฟเชฏเชพเชกเชจเซ€ เชธเชฎเชธเซเชฏเชพเช“ เชฒเช–เซ€, เช…เชจเซ‡ เชชเช›เซ€ เชเชตเซเช‚ เชฌเชจเซเชฏเซเช‚ เช•เซ‡ เชญเชพเชทเชพ เชธเชคเชค เชถเซˆเช•เซเชทเชฃเชฟเช• เชชเซเชฐเชตเซƒเชคเซเชคเชฟเช“เชฎเชพเช‚ เช†เชตเซ€ เช…เชจเซ‡ เช›เซ‡เชตเชŸเซ‡ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชญเชพเชทเชพ เชฌเชจเซ€. เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชœเซเชžเชพเชจเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เช…เชจเซ‡ เชจเชตเซ€ เชคเช•เซ‹ เชตเชฟเชถเซ‡ เชœเชพเชฃเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชฎเชพเช‚ เชญเชพเช— เชฒเซ‡เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚.

เชจเซเชฏเซ‚เชเชฒเซ‡เชŸเชฐเชฎเชพเช‚, เชซเซ‡เช•เชฒเซเชŸเซ€ เชจเซ‡เชคเซƒเชคเซเชต เช˜เชฃเซ€เชตเชพเชฐ เช…เชฎเชพเชฐเซ€ เชตเชฟเชถเซ‡เชทเชคเชพ เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชถเซˆเช•เซเชทเชฃเชฟเช• เช‡เชตเซ‡เชจเซเชŸเซเชธ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชถเซ‡เชฐ เช•เชฐเซ‡ เช›เซ‡. เชธเชชเซเชŸเซ‡เชฎเซเชฌเชฐเชฎเชพเช‚ เช…เชฎเซ‡ C++ เชฐเชถเชฟเชฏเชพ เชตเชฟเชถเซ‡ เชฎเชพเชนเชฟเชคเซ€ เชœเซ‹เชˆ เช…เชจเซ‡ เชถเซเชฐเซ‹เชคเชพเช“ เชคเชฐเซ€เช•เซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เช†เชตเซ€ เชชเชฐเชฟเชทเชฆเซ‹เชฎเชพเช‚ เชญเชพเช— เชฒเซ‡เชตเชพเชจเซ‹ เช† เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเชฅเชฎ เช…เชจเซเชญเชต เช›เซ‡.

เช•เซ‹เชจเซเชซเชฐเชจเซเชธ เชฎเชพเชณเช–เซเช‚

  • เช…เชนเซ‡เชตเชพเชฒเซ‹

เชฌเซ‡ เชฆเชฟเชตเชธ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชจเชฟเชทเซเชฃเชพเชคเซ‹เช 30 เช…เชนเซ‡เชตเชพเชฒเซ‹ เชตเชพเช‚เชšเซเชฏเชพ, เชœเซ‡เชฎเชพเช‚ เช˜เชฃเชพ เชšเชฐเซเชšเชพเชธเซเชชเชฆ เชตเชฟเชทเชฏเซ‹ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ: เชฒเชพเช—เซ เชชเชกเชคเซ€ เชธเชฎเชธเซเชฏเชพเช“เชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชญเชพเชทเชพเชจเซ€ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชจเซ‹ เชฌเซเชฆเซเชงเชฟเชถเชพเชณเซ€ เช‰เชชเชฏเซ‹เช—, เชจเชตเชพ เชงเซ‹เชฐเชฃเชจเชพ เชธเช‚เชฌเช‚เชงเชฎเชพเช‚ เช†เช—เชพเชฎเซ€ เชญเชพเชทเชพ เช…เชชเชกเซ‡เชŸเซเชธ, C++ เชกเชฟเชเชพเช‡เชจเชฎเชพเช‚ เชธเชฎเชพเชงเชพเชจ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชธเชพเชตเชšเซ‡เชคเซ€เช“, เช‰เชฆเชพเชนเชฐเชฃเซ‹. เชฐเชธเชชเซเชฐเชฆ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ, เชคเซ‡เชฎเชœ เชญเชพเชทเชพ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เช…เช‚เชกเชฐ-เชง-เชนเซ‚เชก เชตเชฟเช—เชคเซ‹. เชคเซเชฐเชฃ เชชเซเชฐเชฆเชฐเซเชถเชจ เชเช• เชธเชพเชฅเซ‡ เชฅเชฏเชพ, เชฎเซ‹เชŸเชพเชญเชพเช—เซ‡ เชฌเซ‡ เชฐเชถเชฟเชฏเชจเชฎเชพเช‚ เช…เชจเซ‡ เชเช• เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚.

  • เชšเชฐเซเชšเชพ เชเซ‹เชจ

เชญเชพเชทเชฃ เชชเช›เซ€, เชฌเชงเชพ เชจ เชชเซ‚เช›เชพเชฏเซ‡เชฒเชพ เชชเซเชฐเชถเซเชจเซ‹ เช…เชจเซ‡ เช…เชงเซ‚เชฐเซ€ เชšเชฐเซเชšเชพเช“เชจเซ‡ เชฎเชพเชฐเซเช•เชฐ เชฌเซ‹เชฐเซเชกเชฅเซ€ เชธเชœเซเชœ เชตเช•เซเชคเชพเช“ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เชฎเชพเชŸเซ‡ เช–เชพเชธ เชจเชฟเชฏเซเช•เซเชค เชตเชฟเชธเซเชคเชพเชฐเซ‹เชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เชธเซเช–เชฆ เชตเชพเชฐเซเชคเชพเชฒเชพเชช เชธเชพเชฅเซ‡ เชญเชพเชทเชฃเซ‹ เชตเชšเซเชšเซ‡เชจเชพ เชตเชฟเชฐเชพเชฎเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเซ€ เชธเชพเชฐเซ€ เชฐเซ€เชค.

  • เชฒเชพเชˆเชŸเชจเชฟเช‚เช— เชŸเซ‹เช•เซเชธ เช…เชจเซ‡ เช…เชจเซŒเชชเชšเชพเชฐเชฟเช• เชšเชฐเซเชšเชพเช“

เชœเซ‹ เชคเชฎเซ‡ เชŸเซ‚เช‚เช•เซ‹ เช…เชนเซ‡เชตเชพเชฒ เช†เชชเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ เชคเชฎเซ‡ เชตเซเชนเชพเช‡เชŸเชฌเซ‹เชฐเซเชก เชชเชฐ เชธเชพเช‚เชœเซ‡ เชฒเชพเชˆเชŸเชจเชฟเช‚เช— เชŸเซ‹เช• เชฎเชพเชŸเซ‡ เชธเชพเช‡เชจ เช…เชช เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เช•เซ‹เชจเซเชซเชฐเชจเซเชธ เชตเชฟเชทเชฏ เชชเชฐ เช•เช‚เชˆเชชเชฃ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชพเช‚เชš เชฎเชฟเชจเชฟเชŸเชจเซ‹ เชธเชฎเชฏ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, C++ เชฎเชพเชŸเซ‡ เชธเซ‡เชจเชฟเชŸเชพเชˆเชเชฐเชจเซ‹ เชเชกเชชเซ€ เชชเชฐเชฟเชšเชฏ (เช•เซ‡เชŸเชฒเชพเช• เชฎเชพเชŸเซ‡ เชคเซ‡ เชจเชตเซเช‚ เชนเชคเซเช‚) เช…เชฅเชตเชพ เชธเชพเชˆเชจ เชตเซ‡เชต เชœเชจเชฐเซ‡เชถเชจเชฎเชพเช‚ เชฌเช— เชตเชฟเชถเซ‡เชจเซ€ เชตเชพเชฐเซเชคเชพ เชœเซ‡ เชซเช•เซเชค เชธเชพเช‚เชญเชณเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฃ เชœเซ‹เชˆ เชถเช•เชพเชคเซ€ เชจเชฅเซ€.

เชฌเซ€เชœเซเช‚ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชชเซ‡เชจเชฒ เชšเชฐเซเชšเชพ เช›เซ‡ "เชนเชพเชฐเซเชŸ เชŸเซ เชนเชพเชฐเซเชŸ เช•เชฎเชฟเชŸเซ€ เชธเชพเชฅเซ‡." เชธเซเชŸเซ‡เชœ เชชเชฐ เชฎเชพเชจเช•เซ€เช•เชฐเชฃ เชธเชฎเชฟเชคเชฟเชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชธเชญเซเชฏเซ‹ เช›เซ‡, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฐ เชชเชฐ เชเช• เชธเช—เชกเซ€ เช›เซ‡ (เชธเชคเซเชคเชพเชตเชพเชฐ เชฐเซ€เชคเซ‡ - เชเช• เชจเชฟเชทเซเช เชพเชตเชพเชจ เชตเชพเชคเชพเชตเชฐเชฃ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชชเชฐเช‚เชคเซ เช•เชพเชฐเชฃ "เช•เชพเชฐเชฃ เช•เซ‡ เชฌเชงเซเช‚ เชœ เช†เช—เชฎเชพเช‚ เช›เซ‡" เชตเชงเซ เชฐเชฎเซเชœเซ€ เชฒเชพเช—เซ‡ เช›เซ‡), เชงเซ‹เชฐเชฃ เช…เชจเซ‡ C++ เชจเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชฆเซเชฐเชทเซเชŸเชฟ เชตเชฟเชถเซ‡ เชชเซเชฐเชถเซเชจเซ‹. , เช—เชฐเชฎ เชคเช•เชจเซ€เช•เซ€ เชšเชฐเซเชšเชพเช“ เช…เชจเซ‡ เชนเซ‹เชฒเซ€เชตเชพเชฐ เชตเช—เชฐ. เชคเซ‡ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชธเชฎเชฟเชคเชฟเชฎเชพเช‚ เชเชตเชพ เชœเซ€เชตเช‚เชค เชฒเซ‹เช•เซ‹ เชชเชฃ เช›เซ‡ เช•เซ‡ เชœเซ‡เช“ เช•เช‚เชˆเช• เชตเชฟเชถเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เช–เชพเชคเชฐเซ€ เชจเชฅเซ€ เช…เชฅเชตเชพ เช•เช‚เชˆเช• เชœเชพเชฃเชคเชพ เชจเชฅเซ€.

เชนเซ‹เชฒเซ€เชตเชฐเชจเชพ เชšเชพเชนเช•เซ‹ เชฎเชพเชŸเซ‡, เชคเซเชฐเซ€เชœเซ€ เช˜เชŸเชจเชพ เช•เซ‡เชธ เชชเชฐ เชฐเชนเซ€ - BOF เชธเชคเซเชฐ โ€œเช—เซ‹ เชตเชฟ. C++โ€. เช…เชฎเซ‡ เชเช• เช—เซ‹ เชชเซเชฐเซ‡เชฎเซ€, เชเช• C++ เชชเซเชฐเซ‡เชฎเซ€เชจเซ‡ เชฒเชˆเช เช›เซ€เช, เชธเชคเซเชฐเชจเซ€ เชถเชฐเซ‚เช†เชค เชชเชนเซ‡เชฒเชพเช‚ เชคเซ‡เช“ เชธเชพเชฅเซ‡ เชฎเชณเซ€เชจเซ‡ เชเช• เชตเชฟเชทเชฏ เชชเชฐ 100500 เชธเซเชฒเชพเช‡เชกเซเชธ เชคเซˆเชฏเชพเชฐ เช•เชฐเซ‡ เช›เซ‡ (เชœเซ‡เชฎ เช•เซ‡ C++ เชฎเชพเช‚ เชชเซ‡เช•เซ‡เชœเชจเซ€ เชธเชฎเชธเซเชฏเชพ เช…เชฅเชตเชพ Go เชฎเชพเช‚ เชœเซ‡เชจเชฐเชฟเช•เชจเซ‹ เช…เชญเชพเชต), เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เช“ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชœเซ€เชตเช‚เชค เชšเชฐเซเชšเชพ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเซ‡เช•เซเชทเช•เซ‹ เชธเชพเชฅเซ‡, เช…เชจเซ‡ เชชเซเชฐเซ‡เช•เซเชทเช•เซ‹ เชเช• เชธเชพเชฅเซ‡ เชฌเซ‡ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชจเซ‡ เชธเชฎเชœเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชนเซ‹เชฒเชฟเชตเชฐ เชธเช‚เชฆเชฐเซเชญเชจเซ€ เชฌเชนเชพเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เชฎเชงเซเชฏเชธเซเชฅ เชฆเช–เชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเช•เซเชทเช•เชพเชฐเซ‹ เชธเชพเชฅเซ‡ เชธเชฎเชพเชงเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เช† เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชตเซเชฏเชธเชจเช•เชพเชฐเช• เช›เซ‡: เชถเชฐเซ‚เช†เชคเชจเชพ เช•เซ‡เชŸเชฒเชพเช• เช•เชฒเชพเช•เซ‹ เชชเช›เซ€, เชธเซเชฒเชพเช‡เชกเซเชธเชจเซ‹ เชฎเชพเชคเซเชฐ เช…เชกเชงเซ‹ เชญเชพเช— เชชเซ‚เชฐเซเชฃ เชฅเชฏเซ‹ เชนเชคเซ‹. เช…เช‚เชคเชจเซ‡ เชฎเซ‹เชŸเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชตเซ‡เช— เช†เชชเชตเซ‹ เชชเชกเซเชฏเซ‹.

  • เชญเชพเช—เซ€เชฆเชพเชฐ เชŠเชญเซ‹ เช›เซ‡

เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชจเชพ เชญเชพเช—เซ€เชฆเชพเชฐเซ‹เชจเซ‡ เชนเซ‹เชฒเชฎเชพเช‚ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ - เชธเซเชŸเซ‡เชจเซเชก เชชเชฐ เชคเซ‡เช“เช เชตเชฐเซเชคเชฎเชพเชจ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€, เช‡เชจเซเชŸเชฐเซเชจเชถเซ€เชช เช…เชจเซ‡ เชฐเซ‹เชœเช—เชพเชฐเชจเซ€ เช“เชซเชฐ เช•เชฐเซ€, เช•เซเชตเชฟเช เช…เชจเซ‡ เชจเชพเชจเซ€ เชธเซเชชเชฐเซเชงเชพเช“ เชฏเซ‹เชœเซ€ เช…เชจเซ‡ เชธเชฐเชธ เช‡เชจเชพเชฎเซ‹ เชชเชฃ เช†เชชเซเชฏเชพ. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เช•เซ‡เชŸเชฒเซ€เช• เช•เช‚เชชเชจเซ€เช“เช เช‡เชจเซเชŸเชฐเชตเซเชฏเซเชจเชพ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชคเชฌเช•เซเช•เชพเชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชตเชพเชจเซ€ เช“เชซเชฐ เชชเชฃ เช•เชฐเซ€ เชนเชคเซ€, เชœเซ‡ เชซเช•เซเชค เช…เชนเซ‡เชตเชพเชฒเซ‹ เชธเชพเช‚เชญเชณเชตเชพ เชœ เชจเชนเซ€เช‚ เช†เชตเชคเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเซ€ เชคเช•เชจเซ€เช•เซ€ เชตเชฟเช—เชคเซ‹

เช…เชฎเซ‡ เชฌเช‚เชจเซ‡ เชฆเชฟเชตเชธ เช…เชนเซ‡เชตเชพเชฒเซ‹ เชธเชพเช‚เชญเชณเซเชฏเชพ. เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชธเชฎเชพเช‚เชคเชฐ เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธเชฎเชพเช‚เชฅเซ€ เชเช• เชฐเชฟเชชเซ‹เชฐเซเชŸ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซเช‚ เชฎเซเชถเซเช•เซ‡เชฒ เชนเชคเซเช‚ - เช…เชฎเซ‡ เชตเชฟเชญเชพเชœเชจ เช•เชฐเชตเชพ เช…เชจเซ‡ เชตเชฟเชฐเชพเชฎ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฎเซ‡เชณเชตเซ‡เชฒเชพ เชœเซเชžเชพเชจเชจเซ€ เช†เชชเชฒเซ‡ เช•เชฐเชตเชพ เชธเช‚เชฎเชค เชฅเชฏเชพ. เช…เชจเซ‡ เชคเซ‡เชฎ เช›เชคเชพเช‚, เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช˜เชฃเซเช‚ เชฌเชพเช•เซ€ เช›เซ‡. เช…เชนเซ€เช‚ เช…เชฎเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช เชœเซ‡ เช…เชฎเชจเซ‡ เชธเซŒเชฅเซ€ เชตเชงเซ เชฐเชธเชชเซเชฐเชฆ เชฒเชพเช—เซเชฏเชพเช‚

เช•เชฎเซเชชเชพเช‡เชฒเชฐ เช“เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเชจเชพ เชชเซเชฐเชฟเชเชฎ เชฆเซเชตเชพเชฐเชพ C++ เชฎเชพเช‚ เช…เชชเชตเชพเชฆเซ‹, เชฐเซ‹เชฎเชจ เชฐเซเชธเซเชฏเชพเชฏเซ‡เชต

C++ เชฐเชถเชฟเชฏเชพ: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชฏเซเช‚
เชฅเซ€ เชธเซเชฒเชพเช‡เชก เช•เชฐเซ‹ เชชเซเชฐเชธเซเชคเซเชคเชฟเช“

เชถเซ€เชฐเซเชทเช• เชธเซ‚เชšเชตเซ‡ เช›เซ‡ เชคเซ‡เชฎ, เชฐเซ‹เชฎเชจ เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ LLVM เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชชเชตเชพเชฆเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชคเชฐเชซ เชงเซเชฏเชพเชจ เช†เชชเซ‡ เช›เซ‡. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เชœเซ‡เช“ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชฐเชฃเช•เชพเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชจเชฅเซ€, เชฐเชฟเชชเซ‹เชฐเซเชŸ เชนเชœเซ เชชเชฃ เช•เซ‹เชกเชจเซ‡ เชธเช‚เชญเชตเชฟเชค เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡ เช…เช‚เช—เซ‡ เชฅเซ‹เชกเซ‹ เช–เซเชฏเชพเชฒ เช†เชชเซ€ เชถเช•เซ‡ เช›เซ‡. เช† เชเชŸเชฒเชพ เชฎเชพเชŸเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เช•เชฎเซเชชเชพเช‡เชฒเชฐเซเชธ เช…เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเชพ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช˜เชฃเชพ เชธเชซเชณ เช‰เช•เซ‡เชฒเซ‹ เชเช•เชฐเซ‚เชช เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เชคเซ‡เชฅเซ€, เช…เชชเชตเชพเชฆเชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช˜เชฃเซ€ เชฌเชงเซ€ เชตเชธเซเชคเซเช“ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡: เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช— เช•เซ‹เชก (เชœเซ‹ เช•เซ‹เชˆ เชนเซ‹เชฏ เชคเซ‹) เช…เชฅเชตเชพ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชคเชฐเซ‡ เชฎเชซเชค เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‹ เช…เชจเซ‡ เชธเซเชŸเซ‡เช•เชจเซ‡ เชตเชงเซ เชŠเช‚เชšเซ‹ เช•เชฐเซ‹. เช† เชฌเชงเซเช‚ เช เชนเช•เซ€เช•เชค เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชพเชฏ เช›เซ‡ เช•เซ‡ เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชเชตเชพ เช•เซ‰เชฒเซเชธ เชฎเชพเชŸเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชธเซ‚เชšเชจเชพเช“ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชธเช‚เชญเชตเชฟเชค เช…เชชเชตเชพเชฆเซ‹ เชซเซ‡เช‚เช•เซ€ เชฆเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เชœเซ‹ เช…เชชเชตเชพเชฆ เชตเชพเชธเซเชคเชตเชฎเชพเช‚ เช‰เชญเซ‹ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชจเชฅเซ€, เชคเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชนเชœเซ เชชเชฃ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เช•เซเชฐเชฟเชฏเชพเช“ เช•เชฐเชถเซ‡. เช•เซ‹เชˆเช• เชฐเซ€เชคเซ‡ เช“เชตเชฐเชนเซ‡เชก เช˜เชŸเชพเชกเชตเชพ เชฎเชพเชŸเซ‡, LLVM เชชเชพเชธเซ‡ เชเชตเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เชนเซเชฏเซเชฐเชฟเชธเซเชŸเชฟเช•เซเชธ เช›เซ‡ เชœเซเชฏเชพเช‚ เช…เชชเชตเชพเชฆ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช— เช•เซ‹เชก เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ เช…เชฅเชตเชพ "เชตเชงเชพเชฐเชพเชจเซ€" เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ เช˜เชŸเชพเชกเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชตเช•เซเชคเชพ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฒเช—เชญเช— เชเช• เชกเชเชจเชจเซ€ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเช‚เชจเซ‡ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“ เชฌเชคเชพเชตเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชคเซ‡เช“ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชœเซเชฏเชพเช‚ เช† เชชเชฆเซเชงเชคเชฟเช“ เชฒเชพเช—เซ เชชเชกเชคเซ€ เชจเชฅเซ€.

เช†เชฎ, เชฐเซ‹เชฎเชจ เชฐเซเชธเซเชฏเชพเชฏเซ‡เชต เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“เชจเซ‡ เชจเชฟเชทเซเช•เชฐเซเชท เชชเชฐ เชฒเชˆ เชœเชพเชฏ เช›เซ‡ เช•เซ‡ เช…เชชเชตเชพเชฆ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช— เชงเชฐเชพเชตเชคเชพ เช•เซ‹เชกเชจเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เชถเซ‚เชจเซเชฏ เช“เชตเชฐเชนเซ‡เชก เชธเชพเชฅเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€, เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชธเชฒเชพเชน เช†เชชเซ‡ เช›เซ‡:

  • เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซ‹ เชตเชฟเช•เชพเชธ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชคเซ‡ เชธเชฟเชฆเซเชงเชพเช‚เชคเชฎเชพเช‚ เช…เชชเชตเชพเชฆเซ‹เชจเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡;
  • เชœเซ‹ เช…เชชเชตเชพเชฆเซ‹เชจเซ€ เชนเชœเซ เชชเชฃ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชถเช•เซเชฏ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชฆเชฐเซ‡เช• เชœเช—เซเชฏเชพเช noexcept (เช…เชจเซ‡ const) เชฎเซ‹เชกเชฟเชซเชพเชฏเชฐ เช‰เชฎเซ‡เชฐเชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เชœเซ‡เชฅเซ€ เช•เชฎเซเชชเชพเชˆเชฒเชฐ เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซเช‚ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชธเซเชชเซ€เช•เชฐเซ‡ เช เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชจเซ€ เชชเซเชทเซเชŸเชฟ เช•เชฐเซ€ เชนเชคเซ€ เช•เซ‡ เช…เชชเชตเชพเชฆเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ‹ เช…เชฅเชตเชพ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชฐเชฟเชชเซ‹เชฐเซเชŸเชจเซ€ เชธเซเชฒเชพเช‡เชกเซเชธ เชจเซ€เชšเซ‡เชจเซ€ เชฒเชฟเช‚เช• เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช›เซ‡: [โ€œLLVM เช•เชฎเซเชชเชพเช‡เชฒเชฐ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเชจเชพ เชฒเซ‡เชจเซเชธ เชฆเซเชตเชพเชฐเชพ C++ เช…เชชเชตเชพเชฆเซ‹โ€]

เชœเชจเชฐเซ‡เชŸเชฐ, เช•เซ‹เชฐเซ‹เชŸเซ€เชจ เช…เชจเซ‡ เช…เชจเซเชฏ เชฎเช—เชœ-เช…เชจเชฐเซ‹เชฒเชฟเช‚เช— เชฎเซ€เช เชพเชถ, เช†เชฆเชฟ เชถเชตเชฟเชค

C++ เชฐเชถเชฟเชฏเชพ: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชฏเซเช‚
เชฅเซ€ เชธเซเชฒเชพเช‡เชก เช•เชฐเซ‹ เชชเซเชฐเชธเซเชคเซเชคเชฟเช“

C++20 เชฎเชพเช‚ เชจเชตเซ€เชจเชคเชพเช“เชจเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เช† เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชจเชพ เช˜เชฃเชพ เช…เชนเซ‡เชตเชพเชฒเซ‹เชฎเชพเช‚เชฅเซ€ เชเช• เชฎเชพเชคเซเชฐ เชคเซ‡เชจเซ€ เชฐเช‚เช—เซ€เชจ เชชเซเชฐเชธเซเชคเซเชคเชฟ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฃ เชธเช‚เช—เซเชฐเชน เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชคเชฐเซเช• (เชฒเซ‚เชช, เช•เซ‰เชฒเชฌเซ‡เช•เซเชธ เชฎเชพเชŸเซ‡) เชธเชพเชฅเซ‡เชจเซ€ เชนเชพเชฒเชจเซ€ เชธเชฎเชธเซเชฏเชพเช“เชจเซ€ เชธเซเชชเชทเซเชŸ เช“เชณเช– เชฎเชพเชŸเซ‡ เชชเชฃ เชฏเชพเชฆเช—เชพเชฐ เชนเชคเซ‹.

เช†เชฆเชฟ เชถเชตเชฟเชค เชจเซ€เชšเซ‡เชจเชพเชจเซ‡ เชนเชพเช‡เชฒเชพเช‡เชŸ เช•เชฐเซ‡ เช›เซ‡: เชนเชพเชฒเชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เชชเชฆเซเชงเชคเชฟเช“ เชธเชฎเช—เซเชฐ เชธเช‚เช—เซเชฐเชนเชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เช†เช‚เชคเชฐเชฟเช• เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เช†เชชเชคเซ€ เชจเชฅเซ€ (เช…เชฅเชตเชพ เชคเซ‡เช“ เช•เซ‰เชฒเชฌเซ‡เช•เชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เช…เชชเซเชฐเชฟเชฏ เช†เชกเช…เชธเชฐเซ‹ เชธเชพเชฅเซ‡, เชœเซ‡เชฎ เช•เซ‡ เช•เซ‰เชฒเชฌเซ‡เช• เชนเซ‡เชฒ) . เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ เชชเซเชจเชฐเชพเชตเชฐเซเชคเช•เซ‹ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เชชเชฃ เชฌเชงเซเช‚ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€: เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชธเชพเชฎเชพเชจเซเชฏ เชชเซเชฐเชตเซ‡เชถ เช…เชจเซ‡ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเชตเชพเชจเชพ เชฌเชฟเช‚เชฆเซเช“ เชจเชฅเซ€ (เชชเซเชฐเชพเชฐเช‚เชญ โ†’ เช…เช‚เชค เชตเชฟเชฐเซเชฆเซเชง เช†เชฐเชฌเซ€เช—เชฟเชจ โ†’ เชฐเซ‡เชจเซเชก เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ), เชคเซ‡ เชธเซเชชเชทเซเชŸ เชจเชฅเซ€ เช•เซ‡ เช†เชชเชฃเซ‡ เช•เซ‡เชŸเชฒเชพ เชธเชฎเชฏ เชธเซเชงเซ€ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เช•เชฐเซ€เชถเซเช‚? C++20 เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเซ€เชจเซ‡, เช† เชธเชฎเชธเซเชฏเชพเช“ เชนเชฒ เชฅเชพเชฏ เช›เซ‡!

เชชเซเชฐเชฅเชฎ เชตเชฟเช•เชฒเซเชช: เชถเซเชฐเซ‡เชฃเซ€เช“. เชชเซเชจเชฐเชพเชตเชฐเซเชคเช•เซ‹เชจเซ‡ เชฒเชชเซ‡เชŸเซ€เชจเซ‡, เช…เชฎเชจเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจเชจเซ€ เชถเชฐเซ‚เช†เชค เช…เชจเซ‡ เช…เช‚เชค เชฎเชพเชŸเซ‡ เชเช• เชธเชพเชฎเชพเชจเซเชฏ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชฎเชณเซ‡ เช›เซ‡, เช…เชจเซ‡ เช…เชฎเชจเซ‡ เช•เช‚เชชเซ‹เช เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเชฃ เชฎเชณเซ‡ เช›เซ‡. เช† เชฌเชงเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชกเซ‡เชŸเชพ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชธเชฐเชณ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชฌเชงเซเช‚ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€: เช—เชฃเชคเชฐเซ€เชจเชพ เชคเชฐเซเช•เชจเซ‹ เชญเชพเช— เชšเซ‹เช•เซเช•เชธ เช‡เชŸเชฐเชฐเซ‡เชŸเชฐเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เช…เช‚เชฆเชฐ เชธเซเชฅเชฟเชค เช›เซ‡, เชœเซ‡ เช•เซ‹เชกเชจเซ‡ เชธเชฎเชœเชตเชพ เช…เชจเซ‡ เชกเซ€เชฌเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

C++ เชฐเชถเชฟเชฏเชพ: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชฏเซเช‚
เชฅเซ€ เชธเซเชฒเชพเช‡เชก เช•เชฐเซ‹ เชชเซเชฐเชธเซเชคเซเชคเชฟเช“

เช เซ€เช• เช›เซ‡, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, C++20 เช เช•เซ‹เชฐเซ‹เชŸเซ€เชจเซเชธ เช‰เชฎเซ‡เชฐเซเชฏเชพ (เช•เชพเชฐเซเชฏเซ‹ เช•เซ‡ เชœเซ‡เชจเซ€ เชตเชฐเซเชคเชฃเซ‚เช• เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชœเชจเชฐเซ‡เชŸเชฐ เชœเซ‡เชตเซ€ เชœ เช›เซ‡): เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชธเชพเชšเชตเซ€เชจเซ‡ เช…เชฎเซเช• เชตเชฐเซเชคเชฎเชพเชจ เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเซ€เชจเซ‡ เช…เชฎเชฒเชจเซ‡ เชธเซเชฅเช—เชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช†เชฎ, เช…เชฎเซ‡ เชฎเชพเชคเซเชฐ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€เชจเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฃ เชšเซ‹เช•เซเช•เชธ เช•เซ‹เชฐเซ‹เชŸเซ€เชจเชจเซ€ เช…เช‚เชฆเชฐเชจเชพ เชคเชฎเชพเชฎ เชคเชฐเซเช•เชจเซ‡ เชธเชฎเชพเชตเซ€เชจเซ‡ เชชเชฃ เชนเชพเช‚เชธเชฒ เช•เชฐเซ€เช เช›เซ€เช.

เชชเชฐเช‚เชคเซ เชฎเชฒเชฎเชฎเชพเช‚ เชเช• เชซเซเชฒเชพเชฏ เช›เซ‡: เช† เช•เซเชทเชฃเซ‡ เชคเซ‡เช“ เชซเช•เซเชค เชนเชพเชฒเชจเชพ เช•เชฎเซเชชเชพเช‡เชฒเชฐเซเชธ เชฆเซเชตเชพเชฐเชพ เช†เช‚เชถเชฟเช• เชฐเซ€เชคเซ‡ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เช›เซ‡, เช…เชจเซ‡ เช…เชฎเซ‡ เช‡เชšเซเช›เซ€เช เช›เซ€เช เชคเซ‡เชŸเชฒเซเช‚ เชธเชฐเชธ เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชพเชคเชพ เชจเชฅเซ€: เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซ‹เชฐเซ‹เชŸเซ€เชจเชฎเชพเช‚ เชธเช‚เชฆเชฐเซเชญเซ‹ เช…เชจเซ‡ เช…เชธเซเชฅเชพเชฏเซ€ เชตเชธเซเชคเซเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชคเซ‡ เชนเชœเซ€ เชฏเซ‹เช—เซเชฏ เชจเชฅเซ€. เช‰เชชเชฐเชพเช‚เชค, เช•เซ‹เชฐเซ‹เชŸเซ€เชจเซเชธ เชถเซเช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เชคเซ‡เชจเชพ เชชเชฐ เช•เซ‡เชŸเชฒเชพเช• เชจเชฟเชฏเช‚เชคเซเชฐเชฃเซ‹ เช›เซ‡, เช…เชจเซ‡ เช•เซ‹เชจเซเชธเซเชŸเซ‡เช•เซเชธเชชเซเชฐ เชซเช‚เช•เซเชถเชจเซเชธ, เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐ/เชกเชฟเชธเซเชŸเซเชฐเช•เซเชŸเชฐ เช…เชจเซ‡ เชฎเซเช–เซเชฏ เช† เชธเซ‚เชšเชฟเชฎเชพเช‚ เชถเชพเชฎเซ‡เชฒ เชจเชฅเซ€.

เช†เชฎ, เช•เซ‹เชฐเซ‹เชŸเซ€เชจเซเชธ เชกเซ‡เชŸเชพ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชคเชฐเซเช•เชจเซ€ เชธเชฐเชณเชคเชพ เชธเชพเชฅเซ‡ เชธเชฎเชธเซเชฏเชพเช“เชจเชพ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชญเชพเช—เชจเซ‡ เชนเชฒ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เช…เชฎเชฒเซ€เช•เชฐเชฃเชฎเชพเช‚ เชธเซเชงเชพเชฐเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชธเชพเชฎเช—เซเชฐเซ€:

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

เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชชเซเชฐเชฅเชฎ เชนเซเช‚ เชฌเชพเชนเซเชฏ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“เชจเซ€ เชนเซ‡เชกเชฐ เชซเชพเช‡เชฒเซ‹เชฅเซ€ เช›เซเชŸเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ - เช† เชเชกเชชเชฅเซ€ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชถเซ‡, เช…เชจเซ‡ เชคเชฎเซ‡ เชธเช‚เชญเชตเชฟเชค เชจเชพเชฎ เชคเช•เชฐเชพเชฐ เช…เชจเซ‡ เช…เชจเซเชฏ เชธเชฎเชพเชจ เชญเซ‚เชฒเซ‹เชฅเซ€ เชชเซ‹เชคเชพเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. 

เช เซ€เช• เช›เซ‡, เช…เชฎเซ‡ #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 เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฅเชฏเซ‡เชฒ เชนเซ‹เชตเชพเชฅเซ€, เช† เช•เซ‹เชกเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชชเชฆเชšเซเช›เซ‡เชฆเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชธเช‚เช•เชฒเชจ เชคเชฌเช•เซเช•เซ‡ เชคเซ‡ เชœเชฐเซ‚เชฐเซ€ เช•เชฆ เช…เชจเซ‡ เชธเช‚เชฐเซ‡เช–เชฃ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‡ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเชถเซ‡ เชœเซ‡ เชญเซ‚เชฒเซ‹ เชคเชฐเซ€เช•เซ‡ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช†เชฎ, เชเช• เชตเชงเชพเชฐเชพเชจเชพ เช•เชฎเซเชชเชพเช‡เชฒเซ‡เชถเชจ เชฐเชจเชจเชพ เช–เชฐเซเชšเซ‡, เช…เชฎเซ‡ เช†เชตเชฐเชฟเชค เชตเชฐเซเช—เซ‹เชจเซ€ เช—เชคเชฟเชถเซ€เชฒ เชซเชพเชณเชตเชฃเซ€เชฅเซ€ เช›เซเชŸเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช, เช…เชฎเชฒเซ€เช•เชฐเชฃ เชธเชพเชฅเซ‡ .cpp เชซเชพเช‡เชฒเชฎเชพเช‚ API เช›เซเชชเชพเชตเซ€เช เช›เซ€เช เช…เชจเซ‡ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ เชฆเซเชตเชพเชฐเชพ เช•เซ‡เชถ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เชฏเซ‹เช—เซเชฏ เชกเชฟเชเชพเช‡เชจ เชชเชฃ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช.

เชฒเซ‹เช—เซ€เช‚เช— เช…เชจเซ‡ เชชเชพเชฐเซเชธเซ€เช‚เช— เช“เช›เชพ เชชเซเชฐเชญเชพเชตเชถเชพเชณเซ€ เชฒเชพเช—เชคเชพ เชนเชคเชพ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เช† เชธเชฎเซ€เช•เซเชทเชพเชฎเชพเช‚ เชคเซ‡เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚.

เชฐเชฟเชชเซ‹เชฐเซเชŸเชจเซ€ เชธเซเชฒเชพเช‡เชกเซเชธ เชจเซ€เชšเซ‡เชจเซ€ เชฒเชฟเช‚เช• เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช›เซ‡: ["เชŸเซ‡เช•เซเชธเซ€เชฎเชพเช‚เชฅเซ€ C++ เชฏเซเช•เซเชคเชฟเช“"]

เชคเชฎเชพเชฐเซ‹ เช•เซ‹เชก DRY เชฐเชพเช–เชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช†เชงเซเชจเชฟเช• เชคเช•เชจเซ€เช•เซ‹, Bjรถrn Fahller

เช† เชตเชพเชฐเซเชคเชพเชฒเชพเชชเชฎเชพเช‚, เชฌเซเชฏเซ‹เชฐเซเชจ เชซเชพเชนเชฒเชฐ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชธเซเชฅเชฟเชคเชฟ เชคเชชเชพเชธเชจเซ€ เชถเซˆเชฒเซ€เชฏเซเช•เซเชค เช–เชพเชฎเซ€เชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เช…เชฒเช— เชฐเซ€เชคเซ‹ เชฌเชคเชพเชตเซ‡ เช›เซ‡:

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

เชชเชฐเชฟเชšเชฟเชค เช…เชตเชพเชœ? เชคเชพเชœเซ‡เชคเชฐเชจเชพ เชงเซ‹เชฐเชฃเซ‹เชฎเชพเช‚ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เช˜เชฃเซ€ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ C++ เชคเช•เชจเซ€เช•เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เช•เซ‹เชˆเชชเชฃ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฆเช‚เชก เชตเชฟเชจเชพ เชธเชฎเชพเชจ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเซ‡ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€ เชถเช•เซ‹ เช›เซ‹. เชคเซเชฒเชจเชพ:   

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

เช…เชจเชฟเชถเซเชšเชฟเชค เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชšเซ‡เช•เชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชคเชฐเชค เชœ เชตเซˆเชตเชฟเชงเซเชฏเชธเชญเชฐ เชจเชฎเซ‚เชจเชพเช“ เช…เชจเซ‡ เชซเซ‹เชฒเซเชก เชเช•เซเชธเชชเซเชฐเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชšเชพเชฒเซ‹ เชฎเชพเชจเซ€ เชฒเชˆเช เช•เซ‡ เช†เชชเชฃเซ‡ enum เชจเชพ state_type เชเชฒเชฟเชฎเซ‡เชจเซเชŸ เชธเชพเชฅเซ‡ เช…เชจเซ‡เช• เชšเชฒเซ‹เชจเซ€ เชธเชฎเชพเชจเชคเชพ เชคเชชเชพเชธเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช. เชชเซเชฐเชฅเชฎ เชตเชธเซเชคเซ เชœเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชคเซ‡ เช›เซ‡ เชธเชนเชพเชฏเช• เช•เชพเชฐเซเชฏ เชฒเช–เชตเชพเชจเซเช‚ เช›เซ‡_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) เชฎเชพเช‚ เช“เชŸเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เช…เชญเชฟเช—เชฎ เชซเช•เซเชค เชธเซเชŸเซ‡เชŸ_เชŸเชพเชˆเชช เชคเชคเซเชตเซ‹ เชธเชพเชฅเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เช†เชฆเชฟเชฎ เชชเซเชฐเช•เชพเชฐเซ‹ เชธเชพเชฅเซ‡ เชชเชฃ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจเซ‹เชจ-เชŸเชพเชˆเชช เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชคเชฐเซ€เช•เซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡:


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) เชฎเชพเช‚ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเซเชธ เชœเซ‡เชตเซ€ เชธเซเชตเชฟเชงเชพเช“ เช‰เชชเชฏเซ‹เช—เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฎเชœเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. (เชนเชพ, เชนเชตเซ‡ เชฒเซ‡เชฎเซเชฌเชกเชพ เชธเชฟเชจเซเชŸเซ‡เช•เซเชธ เชฏเชพเชฆ เชฐเชพเช–เชตเซเช‚ เชตเชงเซ เชธเชฐเชณ เช›เซ‡ - เช† เชคเชฎเชพเชฎ เชชเซเชฐเช•เชพเชฐเชจเชพ เช•เซŒเช‚เชธเชจเซ€ เชธเชคเชค เชšเชพเชฐ เชœเซ‹เชกเซ€ เช›เซ‡.) เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐ เชตเชฟเช—เชคเซ‹ เชคเชฐเซ€เช•เซ‡ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เช‚เชคเชฟเชฎ เช‰เช•เซ‡เชฒ เช–เชฐเซ‡เช–เชฐ เชฎเชพเชฐเชพ เช†เชคเซเชฎเชพเชจเซ‡ เช—เชฐเชฎ เช•เชฐเซ‡ เช›เซ‡, เชฒเซ‡เชฎเซเชฌเชกเชพเชจเซ€ เชถเซเชฐเซ‡เชทเซเช  เชชเชฐเช‚เชชเชฐเชพเช“เชฎเชพเช‚ เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ เชŸเชชเชฒเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เชจ เช•เชฐเชตเซ‹. เช•เชฒเชจ

เช…เช‚เชคเซ‡, เชคเซ‡เชจเซ‡ เชชเซ‹เชฒเชฟเชถ เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚:

  • เชฏเชพเชฆ เชฐเชพเช–เซ‹ เช•เซ‡ lambdas เชฎเชซเชคเชฎเชพเช‚ constexpr เช›เซ‡; 
  • เชšเชพเชฒเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เชซเซ‹เชฐเชตเชฐเซเชกเชฟเช‚เช— เช‰เชฎเซ‡เชฐเซ€เช เช…เชจเซ‡ เชฒเซ‡เชฎเซเชฌเชกเชพ เช•เซเชฒเซ‹เชเชฐเชฎเชพเช‚ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชชเซ‡เช•เชจเชพ เชธเช‚เชฌเช‚เชงเชฎเชพเช‚ เชคเซ‡เชจเชพ เชจเซ€เชš เชธเชฟเชจเซเชŸเซ‡เช•เซเชธเชจเซ‡ เชœเซ‹เชˆเช;
  • เชšเชพเชฒเซ‹ เช•เชฎเซเชชเชพเชˆเชฒเชฐเชจเซ‡ เช•เช‚เชกเซ€เชถเชจเชฒ เชจเซ‹เชˆเช•เซเชธเชพเช‡เชก เชธเชพเชฅเซ‡ เช“เชชเซเชŸเชฟเชฎเชพเชˆเชเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชตเชงเซ เชคเช•เซ‹ เช†เชชเซ€เช; 
  • เชšเชพเชฒเซ‹ เชฒเซ‡เชฎเซเชฌเชกเชพเชธเชจเชพ เชธเซเชชเชทเซเชŸ เชตเชณเชคเชฐ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‡ เช†เชญเชพเชฐเซ€ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเซเชธเชฎเชพเช‚ เชตเชงเซ เชธเชฎเชœเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ เชญเซ‚เชฒ เช†เช‰เชŸเชชเซเชŸเชจเซ€ เช•เชพเชณเชœเซ€ เชฒเชˆเช. เช† เช•เชฎเซเชชเชพเชˆเชฒเชฐเชจเซ‡ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชซเช‚เช•เซเชถเชจเชจเซ‡ เชตเชพเชธเซเชคเชตเชฎเชพเช‚ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชตเชงเซ เชคเชชเชพเชธ เช•เชฐเชตเชพ เชฆเชฌเชพเชฃ เช•เชฐเชถเซ‡ - เชชเซเชฐเช•เชพเชฐ เชคเชชเชพเชธเชจเชพ เชคเชฌเช•เซเช•เซ‡. 

เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡, เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชจ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเซ‹: 

เช…เชฎเชพเชฐเซ€ เช›เชพเชช

C++ เชฐเชถเชฟเชฏเชพเชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เชชเซเชฐเชฅเชฎ เชธเชนเชญเชพเช—เชฟเชคเชพ เชคเซ‡เชจเซ€ เชคเซ€เชตเซเชฐเชคเชพ เชฎเชพเชŸเซ‡ เชฏเชพเชฆเช—เชพเชฐ เชนเชคเซ€. เชฎเชจเซ‡ C++ เชฐเชถเชฟเชฏเชพเชจเซ€ เชเช• เชจเชฟเชทเซเช เชพเชตเชพเชจ เช˜เชŸเชจเชพ เชคเชฐเซ€เช•เซ‡เชจเซ€ เช›เชพเชช เชฎเชณเซ€, เชœเซเชฏเชพเช‚ เชคเชพเชฒเซ€เชฎ เช…เชจเซ‡ เชœเซ€เชตเช‚เชค เชธเช‚เชšเชพเชฐ เชตเชšเซเชšเซ‡เชจเซ€ เชฐเซ‡เช–เชพ เชฒเช—เชญเช— เช…เช—เซ‹เชšเชฐ เช›เซ‡. เชตเช•เซเชคเชพเช“เชจเชพ เชฎเซ‚เชกเชฅเซ€ เชฒเชˆเชจเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชชเชพเชฐเซเชŸเชจเชฐเซเชธ เชคเชฐเชซเชฅเซ€ เชธเซเชชเชฐเซเชงเชพเช“ เชธเซเชงเซ€เชจเซ€ เชฆเชฐเซ‡เช• เชฌเชพเชฌเชค เช—เชฐเชฎ เชšเชฐเซเชšเชพเช“ เชฎเชพเชŸเซ‡ เช…เชจเซเช•เซ‚เชณ เช›เซ‡. เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€, เชœเซ‡เชฎเชพเช‚ เช…เชนเซ‡เชตเชพเชฒเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เชคเซ‡เชฎเชพเช‚ C++ เชจเชตเซ€เชจเชคเชพเช“, เชฎเซ‹เชŸเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชจเชพ เช•เซ‡เชธ เชธเซเชŸเชกเซ€เช เช…เชจเซ‡ เชตเซˆเชšเชพเชฐเชฟเช• เชธเซเชฅเชพเชชเชคเซเชฏ เชตเชฟเชšเชพเชฐเชฃเชพเช“ เชธเชนเชฟเชคเชจเชพ เชตเชฟเชทเชฏเซ‹เชจเซ€ เชเช•เชฆเชฎ เชตเซเชฏเชพเชชเช• เชถเซเชฐเซ‡เชฃเซ€ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เชชเชฐเช‚เชคเซ เช˜เชŸเชจเชพเชจเชพ เชธเชพเชฎเชพเชœเชฟเช• เช˜เชŸเช•เชจเซ‡ เช…เชตเช—เชฃเชตเซเช‚ เช…เชฏเซ‹เช—เซเชฏ เชนเชถเซ‡, เชœเซ‡ เชฎเชพเชคเซเชฐ C++ เชจเชพ เชธเช‚เชฌเช‚เชงเชฎเชพเช‚ เชญเชพเชทเชพเชจเชพ เช…เชตเชฐเซ‹เชงเซ‹เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.

เช†เชตเซ€ เช‡เชตเซ‡เชจเซเชŸเชฎเชพเช‚ เชญเชพเช— เชฒเซ‡เชตเชพเชจเซ€ เชคเช• เชฌเชฆเชฒ เช…เชฎเซ‡ เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชจเชพ เช†เชฏเซ‹เชœเช•เซ‹เชจเซ‹ เช†เชญเชพเชฐ เชฎเชพเชจเซ€เช เช›เซ€เช!
เชคเชฎเซ‡ C++ เชฐเชถเชฟเชฏเชพเชจเชพ เชญเซ‚เชคเช•เชพเชณ, เชตเชฐเซเชคเชฎเชพเชจ เช…เชจเซ‡ เชญเชตเชฟเชทเซเชฏ เชตเชฟเชถเซ‡ เช†เชฏเซ‹เชœเช•เซ‹เชจเซ€ เชชเซ‹เชธเซเชŸ เชœเซ‹เชˆ เชนเชถเซ‡ JUG Ru เชฌเซเชฒเซ‹เช— เชชเชฐ.

เชตเชพเช‚เชšเชตเชพ เชฌเชฆเชฒ เช†เชญเชพเชฐ, เช…เชจเซ‡ เช…เชฎเซ‡ เช†เชถเชพ เชฐเชพเช–เซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเชพเชฐเซ€ เช˜เชŸเชจเชพเช“เชจเซเช‚ เชซเชฐเซ€เชฅเซ€ เช•เชนเซ‡เชตเซเช‚ เชฎเชฆเชฆเชฐเซ‚เชช เชนเชคเซเช‚!

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹