{"id":355371,"date":"2024-05-20T23:07:25","date_gmt":"2024-05-20T23:07:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=355371"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=355371","title":{"rendered":"<span>\u041a\u043e\u0433\u0434\u0430 private, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f public<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 2016 \u0433\u043e\u0434\u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u043b\u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044d\u043a\u0448\u043d-\u043e\u0447\u043a\u043e\u0432 &#171;ORBI&#187;, \u044d\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0434\u043e\u043d\u0435\u043f\u0440\u043e\u043d\u0438\u0446\u0430\u0435\u043c\u044b\u0435 \u043e\u0447\u043a\u0438 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c 360\u0432\u0438\u0434\u0435\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d, \u043d\u0443 \u0430 \u0435\u0441\u043b\u0438 \u0441 \u043d\u0438\u043c\u0438 \u043f\u043e\u043f\u043b\u0430\u0432\u0430\u0442\u044c, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. (<a href=\"https:\/\/www.indiegogo.com\/projects\/orbi-prime-the-first-360-video-recording-eyewear#\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.indiegogo.com\/projects\/orbi-prime-the-first-360-video-recording-eyewear#\/<\/a>). \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043a\u043b\u0435\u0439\u043a\u0438 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u0430\u043c\u0435\u0440 \u0432 \u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 360* \u0432\u0438\u0434\u0435\u043e, \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 opencv \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041d\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u0435\u0440\u0435\u0433\u0430\u0435\u043c\u043e\u0435 IP, \u0430 \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a \u043c\u044b \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u044f\u0437\u044b\u043a\u0430 \u0421++ \u043f\u0438\u0441\u0430\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0414\u0430 \u0432\u044b \u0441\u043a\u0430\u0436\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u0442\u0430\u043a\u043e\u0433\u043e &#8212; \u0441\u0434\u0435\u043b\u0430\u043b \u0433\u0435\u0442\u0435\u0440\u044b \u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435. \u0410 \u0435\u0441\u043b\u0438 \u0433\u0435\u0442\u0435\u0440\u0430 \u043d\u0435\u0442 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u0432 private \u0441\u0435\u043a\u0446\u0438\u044e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0435\u0434\u0435\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0418\u043b\u0438 \u0432\u0435\u043d\u0434\u043e\u0440 \u043b\u0438\u0431\u044b \u0437\u0430\u0431\u044b\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0445\u0435\u0434\u0435\u0440\u044b, \u0438 \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 (\u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u0434\u0440\u0443\u0437\u044c\u044f \u043e\u043d\u0438 \u0442\u0430\u043a\u0438\u0435), \u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430\u0434\u043e? \u041f\u043e\u043c\u043d\u043e\u0436\u0438\u0432 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u0444\u0444 \u0438 \u043f\u0440\u0438\u043f\u043b\u044e\u0441\u043e\u0432\u0430\u0432 \u0434\u0438\u043a\u0438\u0439 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e <s>\u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/s> \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0415\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e\u0434\u0438\u043d \u043c\u043e\u0439 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043b\u0438\u0434: &#171;\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430 \u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043a\u043e\u0444\u0444&#187;.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/17c\/528\/5db\/17c5285db81b37e4a0172dcad5ad4bb6.jpeg\" width=\"604\" height=\"356\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/17c\/528\/5db\/17c5285db81b37e4a0172dcad5ad4bb6.jpeg\" data-blurred=\"true\"\/><\/figure>\n<hr\/>\n<p>\u041d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u043e\u0431\u0449\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438\u0437 <s>\u0441\u0432\u043e\u0431\u0434\u043e\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439\u0442\u043e \u043c\u0430\u0442\u0435\u0440\u0438<\/s>  opencv + hugin + stitchEm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0442\u0435\u0441\u0442\u044b \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043d\u044b \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438. \u041d\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0447\u0442\u043e \u043e\u043d\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0431\u044b\u043b\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c.<br \/>\u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 2016 \u0433\u043e\u0434\u0430, \u043e\u0434\u0438\u043d \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u0435\u0432\u0430\u0439\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u043b 4 \u0444\u0440\u0435\u0439\u043c\u0430 \u0432 \u043e\u0434\u0438\u043d, \u0431\u044b\u043b \u043e\u0431\u0432\u0435\u0448\u0430\u043d \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0430\u043c\u043e\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443, \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u043c\u043d\u044e, \u043d\u043e \u0447\u0442\u043e\u0442\u043e \u043e\u043a\u043e\u043b\u043e 50 \u0444\u0440\u0435\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439. \u041a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0434\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0430 \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0440\u0443\u0437\u0435\u0439 \u0432 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u0438 \u0432 \u043a\u0430\u043a\u043e\u0439\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0435\u0448\u0438\u043b\u0438 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u044d\u0442\u0443 \u043f\u043e\u0440\u043e\u0447\u043d\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0443\u0431\u0438\u0440\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ee\/af6\/f56\/9eeaf6f56e29e43013746f6b40927a92.png\" alt=\"\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0436\u0443. \u0412\u043e\u0442 \u043e\u043d, \u044d\u0442\u043e\u0442 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u043e\u0439 \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438!\" title=\"\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0436\u0443. \u0412\u043e\u0442 \u043e\u043d, \u044d\u0442\u043e\u0442 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u043e\u0439 \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438!\" width=\"844\" height=\"618\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ee\/af6\/f56\/9eeaf6f56e29e43013746f6b40927a92.png\"\/><\/p>\n<div><figcaption>\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0436\u0443. \u0412\u043e\u0442 \u043e\u043d, \u044d\u0442\u043e\u0442 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u043e\u0439 \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438!<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0436\u0443. \u0412\u043e\u0442 \u043e\u043d, \u044d\u0442\u043e\u0442 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u043e\u0439 \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438!<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">class OrbiVideo421 : public orbi::intrusive_ptr {    friend struct TestVideoStream; friend struct TestVideoFrame;  friend struct TestVideoStitcher;  friend struct TestVideoPlayer;  friend struct TestVideoTest;  friend struct TestVideoStreamProcessor;  friend struct TestVideoCapture;  friend struct TestVideoWriter;  friend struct TestVideoProcessor;  friend struct TestVideoTestSuite; friend struct TestVideoAnalyzer;  friend struct TestVideoConfiguration;  friend struct TestVideoBuffer;  friend struct TestVideoRenderer;  friend struct TestAudioStream;  friend struct TestAudioFrame;  friend struct TestAudioStitcher;  friend struct TestAudioPlayer;  friend struct TestPerformanceAnalyzer;  friend struct TestErrorLogger;  friend struct TestVideoFrameAnalyzer;  friend struct TestVideoSynchronization;  friend struct TestVideoMetadataExtractor;  friend struct TestVideoComparison;  friend struct TestVideoStreamController;  friend struct TestVideoStreamEncoder;  friend struct TestVideoStreamDecoder;  friend struct TestVideoStreamRouter; friend struct TestVideoEffect; friend struct TestVideoSegmentation;  friend struct TestVideoStreamRecorder;  friend struct TestVideoCompression; friend struct TestVideoStreamSplitter;  friend struct TestVideoStreamSwitcher;  friend struct TestVideoStreamMetadataEditor;  friend struct TestVideoStreamAnalyzer;  \/\/ \u043d\u0438\u0436\u0435 \u0435\u0449\u0435 \u043e\u043a\u043e\u043b\u043e 40 \u0444\u0440\u0435\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u0440\u043e\u0433\u043e<\/h2>\n<pre><code class=\"cpp\">classOrbiMemoryUnit : orbi::vtable_at_top {   friend MemoryTestRead;   friend MemoryTestWrite;      private:     nobject *_object;     uint32_t _reserved_memory; }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0431\u044b\u043b\u043e \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043e \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0440\u0443\u0437\u044c\u044f \u0442\u0435\u0441\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e. \u041d\u043e \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043c\u044b, \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u043d\u0430\u0443\u043a\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0433\u0435\u0442\u0435\u0440\u044b \u043a \u043d\u0443\u0436\u043d\u044b\u043c \u043c\u0435\u043c\u0431\u0435\u0440\u0430\u043c \u043a\u043b\u0430\u0441\u0441\u0430. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0430\u0440\u043e\u0434 \u043f\u043e\u043b\u0435\u0437 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0433\u0435\u0442\u0435\u0440\u044b, \u043d\u043e \u0438 \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u0434 \u0438 \u0438\u043c\u0435\u043d\u0430. \u041d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0437\u0430\u043c\u0430\u044f\u0447\u0438\u043b\u0438 \u043f\u0430\u0440\u0430 \u043d\u0435\u0434\u0435\u043b\u044c \u043c\u0430\u0440\u0442\u044b\u0448\u043a\u0438\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0438 \u043d\u0435 \u0444\u0430\u043a\u0442 \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0442\u0435\u0441\u0442\u0430\u043c. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#171;breaking changes&#187; &#8212; \u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0435\u0437 \u0432\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0438\u0439\u0441\u044f API &#8212; \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438 \u0441\u0430\u0439\u0434\u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u0433 \u043e\u0442\u043b\u043e\u0432\u0438\u0448\u044c. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 300+ \u0441\u0442\u0440\u043e\u0447\u0435\u043a, \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u043d\u043e. \u0418 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u044b \u0441\u043e\u0437\u0432\u043e\u043d\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u044d\u0442\u0443 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 \u0438 \u0441\u0435\u043b\u0438 \u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443.<\/p>\n<pre><code class=\"cpp\">classOrbiMemoryUnit : orbi::vtable_at_top {   private:     nobject *_object;     uint32_t _reserved_memory;    public:   inlinenobject*object() const{ return _object; } inlineuint32_treserved_capacity () const{ return _reserved_memory; } }<\/code><\/pre>\n<p>\u041f\u043b\u044e\u0441\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b, \u0432\u0441\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041c\u0438\u043d\u0443\u0441\u044b \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b, \u0430 \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0438 \u043d\u0435 \u043c\u0438\u043d\u0443\u0441\u044b \u0434\u0430\u0436\u0435, \u0441\u0430\u043c\u044b\u0439 \u044f\u0432\u043d\u044b\u0439 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 API, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0444\u0438\u0447 \u0438 \u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8212; \u043e \u0447\u0435\u043c \u043c\u043d\u0435 \u0438 \u0431\u044b\u043b\u043e \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043e \u041f\u041c\u043e\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043e\u0432\u0435\u0449\u0430\u043d\u0438\u0439. \u0412\u043e\u043e\u0431\u0449\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e &#8212; \u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. <\/p>\n<h2>\u0427\u0435\u0440\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0442\u0441\u044f<\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/611\/0ee\/7dd\/6110ee7dd944a01d4dc94260ed90604f.png\" alt=\"\u00a0\u0421\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u0443\u00a0\u0432\u0430\u0441 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u043a\u0440\u0443\u0433\u0430\u043c\u0438!  \" title=\"\u00a0\u0421\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u0443\u00a0\u0432\u0430\u0441 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u043a\u0440\u0443\u0433\u0430\u043c\u0438!  \" width=\"832\" height=\"618\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/611\/0ee\/7dd\/6110ee7dd944a01d4dc94260ed90604f.png\"\/><\/p>\n<div><figcaption>\u00a0\u0421\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u0443\u00a0\u0432\u0430\u0441 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u043a\u0440\u0443\u0433\u0430\u043c\u0438!  <\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043c\u044b \u0438 \u0436\u0438\u043b\u0438 \u0441 \u044d\u0442\u0438\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u0438\u0435\u043c, \u043f\u043e\u043a\u0430 \u0432 \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0443\u0442\u0440\u043e \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0435 \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0438\u0437 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u041a\u0430\u0442\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0440\u0435\u0448\u0438\u0432 \u0442\u0430\u043c \u0447\u0435\u0433\u043e-\u0442\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c. \u041e\u043d \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c unittest friendly \u043f\u043e\u0433\u0440\u043e\u043c\u0438\u0441\u0442\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0437\u0430 \u0443\u0442\u0440\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0430. \u0410 \u0443\u0436\u0435 \u0432 \u043e\u0431\u0435\u0434 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443 \u0431\u0438\u043b\u0434 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u043e \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0444\u0440\u0435\u043d\u0434\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <strong>OrbiDeviceBattery <\/strong>\u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u043e 100 \u0448\u0442\u0443\u043a (\u044d\u0442\u043e \u043c\u044b \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c) \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Keil-C \u043d\u0438\u0430\u0441\u0438\u043b\u0438\u043b \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0442\u044c, \u0432\u044b\u0432\u0430\u043b\u0438\u0432 \u0432 \u043b\u043e\u0433 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443. <\/p>\n<pre><code>C:\\ent\\orbi\\prod\\KeilMDK\\INCLUDE\\keillex\\xstring(25) : error C2146: syntax error : missing ';' before identifier 'friend' C:\\ent\\orbi\\prod\\KeilMDK\\INCLUDE\\keillex\\xstring(597) : see reference to class template instantiation 'OrbiDeviceBattery&lt;_E,_Tr,_A>' being compiled C:\\ent\\orbi\\prod\\core\\battery\\device.cc(655) : error C2838: illegal qualified name in member declaration<\/code><\/pre>\n<p>\u041a\u0430\u043a\u0438\u043c \u0431\u043e\u043a\u043e\u043c \u043d\u0435\u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <strong>OrbiDeviceBattery <\/strong>\u0441\u0442\u0430\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0437\u0430\u0434\u0435\u043b xstring \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0421\u043b\u043e\u0432\u0430 \u0432 \u043b\u043e\u0433\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438\u043c\u0435\u044e\u0442 \u043c\u0430\u043b\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u0441\u0430\u043c\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0430\u043f\u043f\u043e\u0440\u0442\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u043f\u043e\u0431\u0440\u043e\u0434\u0438\u0432 \u043f\u043e \u0444\u043e\u0440\u0443\u043c\u0443 \u0443\u0432\u0438\u0434\u0435\u043b, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0436\u0430\u043b\u043e\u0431\u044b \u0432 \u043a\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u0442 \u043f\u043e\u043b\u0443\u0433\u043e\u0434\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0430 \u0444\u043e\u0440\u0443\u043c Keil \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0435\u0449\u0435 \u0432 2017 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 &#171;\u043d\u0435\u0437\u0430\u0444\u0438\u043a\u0448\u0435\u043d\u043e&#187;. \u0412\u0438\u0434\u0438\u043c\u043e \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043f\u043e\u043b\u0435\u0436\u0430\u043b\u043e, \u0438 \u0435\u0449\u0435 \u043f\u044f\u0442\u044c \u043f\u043e\u043b\u0435\u0436\u0438\u0442. \u041d\u0430 655 \u0441\u0442\u0440\u043e\u043a\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u0431\u044b\u043b \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0444\u0440\u0435\u043d\u0434 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1e0\/5b3\/a55\/1e05b3a55d72c6f3bdc235e8f7b3dda7.png\" alt=\"\u041c\u0430\u043b\u043e\u0432\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442!\" title=\"\u041c\u0430\u043b\u043e\u0432\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442!\" width=\"702\" height=\"178\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1e0\/5b3\/a55\/1e05b3a55d72c6f3bdc235e8f7b3dda7.png\"\/><\/p>\n<div><figcaption>\u041c\u0430\u043b\u043e\u0432\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442!<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043a\u0440\u0438\u043f\u0435\u0432 \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0441\u0435\u0440\u044b\u043c\u0438 \u043a\u043b\u0435\u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u043d\u0430\u0448\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0445\u0430\u043a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c private\/class \u043d\u0430 public\/struct. \u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u043e\u0442 \u043e\u043d\u043e &#171;\u0449\u0430\u0441\u0442\u044c\u0435&#187; &#8212; \u043f\u0438\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0443\u0448\u0435 \u0443\u0433\u043e\u0434\u043d\u043e, \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0444\u0440\u0435\u043d\u0434\u043e\u0432. \u041d\u043e \u0438 \u0442\u0443\u0442 \u043d\u0430\u0441 \u0436\u0434\u0430\u043b \u0440\u043e\u0437\u043e\u0432\u044b\u0439 \u043f\u0442\u0438\u0446 \u043e\u0431\u043b\u043e\u043c\u0438\u043d\u0433\u043e, \u0442\u043e \u0447\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 clang-\u0435, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c clang-\u0435. \u041a\u0435il \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0447\u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043e\u0442 \u0441\u043b\u043e\u0432\u0430 \u0441\u043e\u0432\u0441\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">#define private public \/\/ illegal #define class struct \/\/ illegal  #include \"core\/view_direction.h\" #include \"core\/view_vec2i.h\" #include \"core\/view_point.h\" <\/code><\/pre>\n<p> \u0410 \u0432\u043e\u0442 gcc\/clang \u0442\u0430\u043a\u043e\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 (<a href=\"https:\/\/onlinegdb.com\/pag5bTK2Yv\" rel=\"noopener noreferrer nofollow\">https:\/\/onlinegdb.com\/pag5bTK2Yv<\/a>). \u041d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0447\u0442\u043e \u0440\u0430\u0441\u0442\u0438\u0442\u044c \u041f\u0430\u0431\u043b\u0438\u043a\u043e\u0432 \u041c\u043e\u0440\u043e\u0437\u043e\u0432\u044b\u0445 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u042d\u0442\u043e \u043c\u044b \u043e\u0442 \u0431\u0435\u0437\u044b\u0441\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u0438\u043c \u0441\u0442\u0440\u0430\u0434\u0430\u043b\u0438. \u0414\u0435\u043b\u0430\u0439\u0442\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u044d\u0442\u043e \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0442\u0435\u0445\u0434\u043e\u043b\u0433\u043e\u043c, \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443.<\/p>\n<pre><code class=\"cpp\">#include &lt;iostream>  using namespace std;  #define private public #define class struct  class A { int l; };  int main() {     A a;     cout &lt;&lt; a.l;     return 0; } <\/code><\/pre>\n<h2>\u0414\u0435\u0434\u0443\u0448\u043a\u0430 \u041f\u0430\u0431\u043b\u0438\u043a\u0430 \u041c\u043e\u0440\u043e\u0437\u043e\u0432\u0430<\/h2>\n<p>\u041d\u043e \u0437\u0430\u0434\u0430\u0447\u043a\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u0430 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u044b\u0439 \u043c\u043e\u0437\u0433, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0442\u0430\u043f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0443\u043d\u0434 \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u0438\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0437\u043e\u0433\u043d\u0443\u0432 \u0441\u043f\u0438\u043d\u0443, \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u043c \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u0435\u043d\u0430\u0432\u0438\u0441\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043a\u043b\u0435\u0439\u043a\u0438. \u041e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043f\u0438\u0441\u0430\u043b Herb Suttter \u0435\u0449\u0435 \u0432 2010 \u0433\u043e\u0434\u0443 (<a href=\"http:\/\/www.gotw.ca\/gotw\/076.htm\" rel=\"noopener noreferrer nofollow\">http:\/\/www.gotw.ca\/gotw\/076.htm<\/a>), \u043d\u043e \u0441\u0447\u0438\u0442\u0430\u043b \u0435\u0451 \u0441\u043a\u043e\u0440\u0435\u0435 \u0444\u0438\u0447\u0435\u0439 \u044f\u0437\u044b\u043a\u0430 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u043f\u043e\u0436\u0430\u0440\u043d\u044b\u0439.<\/p>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0443\u0447\u0430\u044e:<\/p>\n<blockquote>\n<p>never subvert the language; for example, never attempt to break encapsulation by copying a class definition and adding a friend declaration, or by providing a local instantiation of a template member function (GotW #76), Herb Sutter<\/p>\n<\/blockquote>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0421\u0430\u0442\u0442\u0435\u0440\u0430 (<a href=\"https:\/\/onlinegdb.com\/cn7bOdWdn\" rel=\"noopener noreferrer nofollow\">https:\/\/onlinegdb.com\/cn7bOdWdn<\/a>), \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u043b\u044e\u0441\u043e\u0432, \u0441 \u043e\u0434\u043d\u043e\u0439 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u043e\u0439, \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432 \u043f\u0430\u0431\u043b\u0438\u043a \u0437\u043e\u043d\u0435. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e,  \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430,  \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438. <\/p>\n<pre><code class=\"cpp\">class X {  public:   X() : private_(1) { \/*...*\/ }    template&lt;class T>   void f( const T&amp; t ) { \/*...*\/ }    int Value() { return private_; }  private:    int private_;  };  namespace {   struct Y {}; }  template&lt;> void X::f( const Y&amp; ) {   private_ = 2; \/\/ evil laughter here }  int main() {   X x;   cout &lt;&lt; x.Value() &lt;&lt; endl; \/\/ prints 1   x.f( Y() );   cout &lt;&lt; x.Value() &lt;&lt; endl; \/\/ prints 2 }<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0434\u043b\u044f 90% \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u043d\u0430\u0448\u0438 \u0444\u0440\u0435\u043d\u0434\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0434\u043b\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u043e\u043b\u044c\u0437\u044b, \u0442.\u0435. \u043c\u0438\u043d\u0443\u0441 \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0440\u0435\u043d\u0434\u044b \u0438\u0437 \u0445\u0435\u0434\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u043e\u0434\u043d\u043e \u041d\u041e&#8230; \u043d\u0435 \u0432\u0435\u0437\u0434\u0435 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u043e\u043a\u0443\u0441.<\/p>\n<h2>\u0412\u0441\u0435\u0445 \u0443\u0431\u0438\u043b \u0441\u0430\u0434\u043e\u0432\u043d\u0438\u043a<\/h2>\n<p> \u0415\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u0447\u043b\u0435\u043d\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043d\u0435 \u043f\u0430\u043b\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0447\u043b\u0435\u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u043e \u0443\u043c\u043d\u0435\u0435 \u043d\u0430\u0441 \u0438 \u043e\u0431\u0435\u0440\u0435\u0433\u0430\u0435\u0442 \u043e\u0442 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0442\u0435\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">struct A { private:   char const* x = \"private data\"; };  int main() {   auto ptr = &amp;A::x; }  ...  main.cpp: In function \u2018int main()\u2019: main.cpp:46:19: error: \u2018const char* A::x\u2019 is private within this context    46 |    auto ptr = &amp;A::x;       |                   ^<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd1\/9f9\/d81\/bd19f9d81e952599ad4087922929dfbe.png\" alt=\"\u042f \u0432\u0430\u043c\u00a0\u043f\u043e\u0441\u044b\u043b\u043a\u0443 \u043f\u0440\u0438\u043d\u0435\u0441. \u0422\u043e\u043a\u00a0\u044f\u00a0\u0432\u0430\u043c \u0435\u0435\u00a0\u043d\u0435 \u043e\u0442\u0434\u0430\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0443\u00a0\u0432\u0430\u0441 \u0434\u043e\u043a\u0423\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u043d\u0435\u0442.  \" title=\"\u042f \u0432\u0430\u043c\u00a0\u043f\u043e\u0441\u044b\u043b\u043a\u0443 \u043f\u0440\u0438\u043d\u0435\u0441. \u0422\u043e\u043a\u00a0\u044f\u00a0\u0432\u0430\u043c \u0435\u0435\u00a0\u043d\u0435 \u043e\u0442\u0434\u0430\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0443\u00a0\u0432\u0430\u0441 \u0434\u043e\u043a\u0423\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u043d\u0435\u0442.  \" width=\"838\" height=\"620\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bd1\/9f9\/d81\/bd19f9d81e952599ad4087922929dfbe.png\"\/><\/p>\n<div><figcaption>\u042f \u0432\u0430\u043c\u00a0\u043f\u043e\u0441\u044b\u043b\u043a\u0443 \u043f\u0440\u0438\u043d\u0435\u0441. \u0422\u043e\u043a\u00a0\u044f\u00a0\u0432\u0430\u043c \u0435\u0435\u00a0\u043d\u0435 \u043e\u0442\u0434\u0430\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0443\u00a0\u0432\u0430\u0441 \u0434\u043e\u043a\u0423\u043c\u0435\u043d\u0442\u043e\u0432\u00a0<a href=\"https:\/\/citaty.info\/topic\/net\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u0442<\/a>.  <\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0430\u0442\u044c <s>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043a\u0443\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f<\/s> \u0430\u0434\u0440\u0435\u0441 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0442\u043e \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e. \u041c\u044b \u0432\u0435\u0434\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0430\u043b\u0435\u0435 \u0441 \u043d\u0438\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c, \u0442\u0430\u043a &#8212; \u043f\u043b\u044e\u0448\u043a\u0430\u043c\u0438 \u0431\u0430\u043b\u0443\u0435\u043c\u0441\u044f.<\/p>\n<pre><code class=\"cpp\">struct A { private:   char const* x = \"private data\"; };  template &lt;class Stub, typename Stub::type x> struct private_member_x {     private_member_x() { auto ptr = x; } };  \/\/ \u0442\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u0441\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 struct A_x { typedef char const *(A::*type); };  \/\/ \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0442\u0438\u043f\u043e\u043c (\u043f\u043e\u0434\u043c\u0435\u043d\u043d\u044b\u043c) template struct private_member_x&lt;A_x, &amp;A::x>;  int main() {}  \/\/ \u0432\u0441\u0435 \u0447\u0438\u0441\u0442\u043e, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a \u0442\u043e \u0442\u0430\u043a (\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0431\u0435\u043b\u044c\u043d\u043e) <a href=\"https:\/\/onlinegdb.com\/-am_9JCwR\" rel=\"noopener noreferrer nofollow\">https:\/\/onlinegdb.com\/-am_9JCwR<\/a><\/p>\n<pre><code class=\"cpp\">\/\/ \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 template &lt;class Stub> struct member { static typename Stub::type value; };   \/\/ \u0441\u0442\u0430\u0442\u0438\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 template &lt;class Stub>  typename Stub::type member&lt;Stub>::value;  \/\/ \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0442\u0438\u043f\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \/\/ stub \u0443\u0439\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441 member, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 template &lt;class Stub, typename Stub::type x> struct private_member {   private_member() { member&lt;Stub>::value = x; } \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439   static private_member instance; }; \/\/ thanks to @mr_Ulman template &lt;class Stub, typename Stub::type x>  private_member&lt;Stub, x> private_member&lt;Stub, x>::instance;  \/\/ \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441 struct PapaPavlica { private:   char const* papini_dengi = \"papini dengi\"; };  \/\/ \u043f\u043e\u0434\u043c\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043f\u0443\u0433\u0430\u043b\u0441\u044f \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 struct A_x { typedef char const *(PapaPavlica::*type); };  \/\/ \u043c\u0430\u0433\u0438\u044f, \u0437\u0434\u0435\u0441\u044c \u0436\u0438\u0432\u0443\u0442 \u0434\u0440\u0430\u043a\u043e\u043d\u044b template struct private_member&lt;A_x, &amp;PapaPavlica::papini_dengi>;  int main() {    PapaPavlica papa;    std::cout &lt;&lt; papa.*member&lt;A_x>::value &lt;&lt; std::endl; \/\/ papini_dengi    \/\/ \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e    \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c *(papa).(&amp;PapaPavlica::papini_dengi) = \"deneg net\"    papa.*member&lt;A_x>::value = \"deneg net\";    std::cout &lt;&lt; papa.*member&lt;A_x>::value &lt;&lt; std::endl; \/\/ deneg net }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u044b \u0432 \u043f\u0440\u043e\u0434 \u043d\u0435 \u043f\u0443\u0441\u0442\u0438\u043b\u0438, \u043e\u043d \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0443\u0434\u0435\u043b\u043e\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0432\u043f\u0438\u0441\u0430\u043b\u0441\u044f \u0442\u0430\u043c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e. \u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432\u0430\u0441 \u0431\u0435\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u043b\u0438\u0431\u044b (<a href=\"https:\/\/github.com\/altamic\/privablic\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/altamic\/privablic<\/a>), \u043a\u0443\u043f\u0438\u0442\u0435 \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u043d\u0430\u0448\u0435\u043c\u0443 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044e \u044e\u043d\u0438\u0442\u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0437 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u041a\u0430\u0442\u0430\u043d\u0438\u0438 \u043f\u0438\u0432\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/239\/e1e\/756\/239e1e756141a02540b5a570d348438f.jpg\" alt=\"\u0415\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e\" title=\"\u0415\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e\" width=\"995\" height=\"652\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/239\/e1e\/756\/239e1e756141a02540b5a570d348438f.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0415\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/762250\/\"> https:\/\/habr.com\/ru\/articles\/762250\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 2016 \u0433\u043e\u0434\u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u043b\u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044d\u043a\u0448\u043d-\u043e\u0447\u043a\u043e\u0432 &#171;ORBI&#187;, \u044d\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0434\u043e\u043d\u0435\u043f\u0440\u043e\u043d\u0438\u0446\u0430\u0435\u043c\u044b\u0435 \u043e\u0447\u043a\u0438 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c 360\u0432\u0438\u0434\u0435\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d, \u043d\u0443 \u0430 \u0435\u0441\u043b\u0438 \u0441 \u043d\u0438\u043c\u0438 \u043f\u043e\u043f\u043b\u0430\u0432\u0430\u0442\u044c, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. (<a href=\"https:\/\/www.indiegogo.com\/projects\/orbi-prime-the-first-360-video-recording-eyewear#\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.indiegogo.com\/projects\/orbi-prime-the-first-360-video-recording-eyewear#\/<\/a>). \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043a\u043b\u0435\u0439\u043a\u0438 \u0432\u0438\u0434\u0435\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u0430\u043c\u0435\u0440 \u0432 \u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 360* \u0432\u0438\u0434\u0435\u043e, \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 opencv \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041d\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u0435\u0440\u0435\u0433\u0430\u0435\u043c\u043e\u0435 IP, \u0430 \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a \u043c\u044b \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u044f\u0437\u044b\u043a\u0430 \u0421++ \u043f\u0438\u0441\u0430\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0414\u0430 \u0432\u044b \u0441\u043a\u0430\u0436\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u0442\u0430\u043a\u043e\u0433\u043e &#8212; \u0441\u0434\u0435\u043b\u0430\u043b \u0433\u0435\u0442\u0435\u0440\u044b \u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435. \u0410 \u0435\u0441\u043b\u0438 \u0433\u0435\u0442\u0435\u0440\u0430 \u043d\u0435\u0442 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u0432 private \u0441\u0435\u043a\u0446\u0438\u044e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0435\u0434\u0435\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0418\u043b\u0438 \u0432\u0435\u043d\u0434\u043e\u0440 \u043b\u0438\u0431\u044b \u0437\u0430\u0431\u044b\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0445\u0435\u0434\u0435\u0440\u044b, \u0438 \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 (\u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u0434\u0440\u0443\u0437\u044c\u044f \u043e\u043d\u0438 \u0442\u0430\u043a\u0438\u0435), \u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430\u0434\u043e? \u041f\u043e\u043c\u043d\u043e\u0436\u0438\u0432 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u0444\u0444 \u0438 \u043f\u0440\u0438\u043f\u043b\u044e\u0441\u043e\u0432\u0430\u0432 \u0434\u0438\u043a\u0438\u0439 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e <s>\u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/s> \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0415\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e\u0434\u0438\u043d \u043c\u043e\u0439 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043b\u0438\u0434: &#171;\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430 \u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043a\u043e\u0444\u0444&#187;.<\/p>\n<figure class=\"full-width\"><\/figure>\n<hr\/>\n<p>\u041d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u043e\u0431\u0449\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438\u0437 <s>\u0441\u0432\u043e\u0431\u0434\u043e\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439\u0442\u043e \u043c\u0430\u0442\u0435\u0440\u0438<\/s>  opencv + hugin + stitchEm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0442\u0435\u0441\u0442\u044b \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043d\u044b \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438. \u041d\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0447\u0442\u043e \u043e\u043d\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0431\u044b\u043b\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c.<br \/>\u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 2016 \u0433\u043e\u0434\u0430, \u043e\u0434\u0438\u043d \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u0435\u0432\u0430\u0439\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u043b 4 \u0444\u0440\u0435\u0439\u043c\u0430 \u0432 \u043e\u0434\u0438\u043d, \u0431\u044b\u043b \u043e\u0431\u0432\u0435\u0448\u0430\u043d \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0430\u043c\u043e\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443, \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u043c\u043d\u044e, \u043d\u043e \u0447\u0442\u043e\u0442\u043e \u043e\u043a\u043e\u043b\u043e 50 \u0444\u0440\u0435\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439. \u041a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0434\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0430 \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0440\u0443\u0437\u0435\u0439 \u0432 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u0438 \u0432 \u043a\u0430\u043a\u043e\u0439\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0435\u0448\u0438\u043b\u0438 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u044d\u0442\u0443 \u043f\u043e\u0440\u043e\u0447\u043d\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0443\u0431\u0438\u0440\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0436\u0443. \u0412\u043e\u0442 \u043e\u043d, \u044d\u0442\u043e\u0442 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u043e\u0439 \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438!<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0436\u0443. \u0412\u043e\u0442 \u043e\u043d, \u044d\u0442\u043e\u0442 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u043e\u0439 \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438!<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">class OrbiVideo421 : public orbi::intrusive_ptr {    friend struct TestVideoStream; friend struct TestVideoFrame;  friend struct TestVideoStitcher;  friend struct TestVideoPlayer;  friend struct TestVideoTest;  friend struct TestVideoStreamProcessor;  friend struct TestVideoCapture;  friend struct TestVideoWriter;  friend struct TestVideoProcessor;  friend struct TestVideoTestSuite; friend struct TestVideoAnalyzer;  friend struct TestVideoConfiguration;  friend struct TestVideoBuffer;  friend struct TestVideoRenderer;  friend struct TestAudioStream;  friend struct TestAudioFrame;  friend struct TestAudioStitcher;  friend struct TestAudioPlayer;  friend struct TestPerformanceAnalyzer;  friend struct TestErrorLogger;  friend struct TestVideoFrameAnalyzer;  friend struct TestVideoSynchronization;  friend struct TestVideoMetadataExtractor;  friend struct TestVideoComparison;  friend struct TestVideoStreamController;  friend struct TestVideoStreamEncoder;  friend struct TestVideoStreamDecoder;  friend struct TestVideoStreamRouter; friend struct TestVideoEffect; friend struct TestVideoSegmentation;  friend struct TestVideoStreamRecorder;  friend struct TestVideoCompression; friend struct TestVideoStreamSplitter;  friend struct TestVideoStreamSwitcher;  friend struct TestVideoStreamMetadataEditor;  friend struct TestVideoStreamAnalyzer;  \/\/ \u043d\u0438\u0436\u0435 \u0435\u0449\u0435 \u043e\u043a\u043e\u043b\u043e 40 \u0444\u0440\u0435\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u0440\u043e\u0433\u043e<\/h2>\n<pre><code class=\"cpp\">classOrbiMemoryUnit : orbi::vtable_at_top {   friend MemoryTestRead;   friend MemoryTestWrite;      private:     nobject *_object;     uint32_t _reserved_memory; }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0431\u044b\u043b\u043e \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043e \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0440\u0443\u0437\u044c\u044f \u0442\u0435\u0441\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e. \u041d\u043e \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043c\u044b, \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u043d\u0430\u0443\u043a\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0433\u0435\u0442\u0435\u0440\u044b \u043a \u043d\u0443\u0436\u043d\u044b\u043c \u043c\u0435\u043c\u0431\u0435\u0440\u0430\u043c \u043a\u043b\u0430\u0441\u0441\u0430. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0430\u0440\u043e\u0434 \u043f\u043e\u043b\u0435\u0437 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0433\u0435\u0442\u0435\u0440\u044b, \u043d\u043e \u0438 \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u0434 \u0438 \u0438\u043c\u0435\u043d\u0430. \u041d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0437\u0430\u043c\u0430\u044f\u0447\u0438\u043b\u0438 \u043f\u0430\u0440\u0430 \u043d\u0435\u0434\u0435\u043b\u044c \u043c\u0430\u0440\u0442\u044b\u0448\u043a\u0438\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0438 \u043d\u0435 \u0444\u0430\u043a\u0442 \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0442\u0435\u0441\u0442\u0430\u043c. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#171;breaking changes&#187; &#8212; \u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0435\u0437 \u0432\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0438\u0439\u0441\u044f API &#8212; \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438 \u0441\u0430\u0439\u0434\u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u0433 \u043e\u0442\u043b\u043e\u0432\u0438\u0448\u044c. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 300+ \u0441\u0442\u0440\u043e\u0447\u0435\u043a, \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u043d\u043e. \u0418 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u044b \u0441\u043e\u0437\u0432\u043e\u043d\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u044d\u0442\u0443 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 \u0438 \u0441\u0435\u043b\u0438 \u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443.<\/p>\n<pre><code class=\"cpp\">classOrbiMemoryUnit : orbi::vtable_at_top {   private:     nobject *_object;     uint32_t _reserved_memory;    public:   inlinenobject*object() const{ return _object; } inlineuint32_treserved_capacity () const{ return _reserved_memory; } }<\/code><\/pre>\n<p>\u041f\u043b\u044e\u0441\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b, \u0432\u0441\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041c\u0438\u043d\u0443\u0441\u044b \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b, \u0430 \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0438 \u043d\u0435 \u043c\u0438\u043d\u0443\u0441\u044b \u0434\u0430\u0436\u0435, \u0441\u0430\u043c\u044b\u0439 \u044f\u0432\u043d\u044b\u0439 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 API, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0444\u0438\u0447 \u0438 \u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8212; \u043e \u0447\u0435\u043c \u043c\u043d\u0435 \u0438 \u0431\u044b\u043b\u043e \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043e \u041f\u041c\u043e\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043e\u0432\u0435\u0449\u0430\u043d\u0438\u0439. \u0412\u043e\u043e\u0431\u0449\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e &#8212; \u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0438 \u0434\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. <\/p>\n<h2>\u0427\u0435\u0440\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0442\u0441\u044f<\/h2>\n<figure class=\"full-width\">\n<div><figcaption>\u00a0\u0421\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u0443\u00a0\u0432\u0430\u0441 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u043a\u0440\u0443\u0433\u0430\u043c\u0438!  <\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043c\u044b \u0438 \u0436\u0438\u043b\u0438 \u0441 \u044d\u0442\u0438\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u0438\u0435\u043c, \u043f\u043e\u043a\u0430 \u0432 \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0443\u0442\u0440\u043e \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0435 \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0438\u0437 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u041a\u0430\u0442\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0440\u0435\u0448\u0438\u0432 \u0442\u0430\u043c \u0447\u0435\u0433\u043e-\u0442\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c. \u041e\u043d \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c unittest friendly \u043f\u043e\u0433\u0440\u043e\u043c\u0438\u0441\u0442\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0437\u0430 \u0443\u0442\u0440\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0430. \u0410 \u0443\u0436\u0435 \u0432 \u043e\u0431\u0435\u0434 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443 \u0431\u0438\u043b\u0434 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u043e \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0444\u0440\u0435\u043d\u0434\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <strong>OrbiDeviceBattery <\/strong>\u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u043e 100 \u0448\u0442\u0443\u043a (\u044d\u0442\u043e \u043c\u044b \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c) \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Keil-C \u043d\u0438\u0430\u0441\u0438\u043b\u0438\u043b \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0442\u044c, \u0432\u044b\u0432\u0430\u043b\u0438\u0432 \u0432 \u043b\u043e\u0433 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443. <\/p>\n<pre><code>C:\\ent\\orbi\\prod\\KeilMDK\\INCLUDE\\keillex\\xstring(25) : error C2146: syntax error : missing ';' before identifier 'friend' C:\\ent\\orbi\\prod\\KeilMDK\\INCLUDE\\keillex\\xstring(597) : see reference to class template instantiation 'OrbiDeviceBattery&lt;_E,_Tr,_A>' being compiled C:\\ent\\orbi\\prod\\core\\battery\\device.cc(655) : error C2838: illegal qualified name in member declaration<\/code><\/pre>\n<p>\u041a\u0430\u043a\u0438\u043c \u0431\u043e\u043a\u043e\u043c \u043d\u0435\u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <strong>OrbiDeviceBattery <\/strong>\u0441\u0442\u0430\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0437\u0430\u0434\u0435\u043b xstring \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0421\u043b\u043e\u0432\u0430 \u0432 \u043b\u043e\u0433\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438\u043c\u0435\u044e\u0442 \u043c\u0430\u043b\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u0441\u0430\u043c\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0430\u043f\u043f\u043e\u0440\u0442\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u043f\u043e\u0431\u0440\u043e\u0434\u0438\u0432 \u043f\u043e \u0444\u043e\u0440\u0443\u043c\u0443 \u0443\u0432\u0438\u0434\u0435\u043b, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0436\u0430\u043b\u043e\u0431\u044b \u0432 \u043a\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u0442 \u043f\u043e\u043b\u0443\u0433\u043e\u0434\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0430 \u0444\u043e\u0440\u0443\u043c Keil \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0435\u0449\u0435 \u0432 2017 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 &#171;\u043d\u0435\u0437\u0430\u0444\u0438\u043a\u0448\u0435\u043d\u043e&#187;. \u0412\u0438\u0434\u0438\u043c\u043e \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043f\u043e\u043b\u0435\u0436\u0430\u043b\u043e, \u0438 \u0435\u0449\u0435 \u043f\u044f\u0442\u044c \u043f\u043e\u043b\u0435\u0436\u0438\u0442. \u041d\u0430 655 \u0441\u0442\u0440\u043e\u043a\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u0431\u044b\u043b \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0444\u0440\u0435\u043d\u0434 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041c\u0430\u043b\u043e\u0432\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442!<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043a\u0440\u0438\u043f\u0435\u0432 \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0441\u0435\u0440\u044b\u043c\u0438 \u043a\u043b\u0435\u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u043d\u0430\u0448\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0445\u0430\u043a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c private\/class \u043d\u0430 public\/struct. \u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u043e\u0442 \u043e\u043d\u043e &#171;\u0449\u0430\u0441\u0442\u044c\u0435&#187; &#8212; \u043f\u0438\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0443\u0448\u0435 \u0443\u0433\u043e\u0434\u043d\u043e, \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0444\u0440\u0435\u043d\u0434\u043e\u0432. \u041d\u043e \u0438 \u0442\u0443\u0442 \u043d\u0430\u0441 \u0436\u0434\u0430\u043b \u0440\u043e\u0437\u043e\u0432\u044b\u0439 \u043f\u0442\u0438\u0446 \u043e\u0431\u043b\u043e\u043c\u0438\u043d\u0433\u043e, \u0442\u043e \u0447\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 clang-\u0435, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c clang-\u0435. \u041a\u0435il \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0447\u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043e\u0442 \u0441\u043b\u043e\u0432\u0430 \u0441\u043e\u0432\u0441\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">#define private public \/\/ illegal #define class struct \/\/ illegal  #include \"core\/view_direction.h\" #include \"core\/view_vec2i.h\" #include \"core\/view_point.h\" <\/code><\/pre>\n<p> \u0410 \u0432\u043e\u0442 gcc\/clang \u0442\u0430\u043a\u043e\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 (<a href=\"https:\/\/onlinegdb.com\/pag5bTK2Yv\" rel=\"noopener noreferrer nofollow\">https:\/\/onlinegdb.com\/pag5bTK2Yv<\/a>). \u041d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0447\u0442\u043e \u0440\u0430\u0441\u0442\u0438\u0442\u044c \u041f\u0430\u0431\u043b\u0438\u043a\u043e\u0432 \u041c\u043e\u0440\u043e\u0437\u043e\u0432\u044b\u0445 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u042d\u0442\u043e \u043c\u044b \u043e\u0442 \u0431\u0435\u0437\u044b\u0441\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u0438\u043c \u0441\u0442\u0440\u0430\u0434\u0430\u043b\u0438. \u0414\u0435\u043b\u0430\u0439\u0442\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u044d\u0442\u043e \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0442\u0435\u0445\u0434\u043e\u043b\u0433\u043e\u043c, \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443.<\/p>\n<pre><code class=\"cpp\">#include &lt;iostream>  using namespace std;  #define private public #define class struct  class A { int l; };  int main() {     A a;     cout &lt;&lt; a.l;     return 0; } <\/code><\/pre>\n<h2>\u0414\u0435\u0434\u0443\u0448\u043a\u0430 \u041f\u0430\u0431\u043b\u0438\u043a\u0430 \u041c\u043e\u0440\u043e\u0437\u043e\u0432\u0430<\/h2>\n<p>\u041d\u043e \u0437\u0430\u0434\u0430\u0447\u043a\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u0430 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u044b\u0439 \u043c\u043e\u0437\u0433, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0442\u0430\u043f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0443\u043d\u0434 \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u0438\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0437\u043e\u0433\u043d\u0443\u0432 \u0441\u043f\u0438\u043d\u0443, \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u043c \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u0435\u043d\u0430\u0432\u0438\u0441\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043a\u043b\u0435\u0439\u043a\u0438. \u041e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043f\u0438\u0441\u0430\u043b Herb Suttter \u0435\u0449\u0435 \u0432 2010 \u0433\u043e\u0434\u0443 (<a href=\"http:\/\/www.gotw.ca\/gotw\/076.htm\" rel=\"noopener noreferrer nofollow\">http:\/\/www.gotw.ca\/gotw\/076.htm<\/a>), \u043d\u043e \u0441\u0447\u0438\u0442\u0430\u043b \u0435\u0451 \u0441\u043a\u043e\u0440\u0435\u0435 \u0444\u0438\u0447\u0435\u0439 \u044f\u0437\u044b\u043a\u0430 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u043f\u043e\u0436\u0430\u0440\u043d\u044b\u0439.<\/p>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0443\u0447\u0430\u044e:<\/p>\n<blockquote>\n<p>never subvert the language; for example, never attempt to break encapsulation by copying a class definition and adding a friend declaration, or by providing a local instantiation of a template member function (GotW #76), Herb Sutter<\/p>\n<\/blockquote>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0421\u0430\u0442\u0442\u0435\u0440\u0430 (<a href=\"https:\/\/onlinegdb.com\/cn7bOdWdn\" rel=\"noopener noreferrer nofollow\">https:\/\/onlinegdb.com\/cn7bOdWdn<\/a>), \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u043b\u044e\u0441\u043e\u0432, \u0441 \u043e\u0434\u043d\u043e\u0439 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u043e\u0439, \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432 \u043f\u0430\u0431\u043b\u0438\u043a \u0437\u043e\u043d\u0435. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e,  \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430,  \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438. <\/p>\n<pre><code class=\"cpp\">class X {  public:   X() : private_(1) { \/*...*\/ }    template&lt;class T>   void f( const T&amp; t ) { \/*...*\/ }    int Value() { return private_; }  private:    int private_;  };  namespace {   struct Y {}; }  template&lt;> void X::f( const Y&amp; ) {   private_ = 2; \/\/ evil laughter here }  int main() {   X x;   cout &lt;&lt; x.Value() &lt;&lt; endl; \/\/ prints 1   x.f( Y() );   cout &lt;&lt; x.Value() &lt;&lt; endl; \/\/ prints 2 }<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0434\u043b\u044f 90% \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u043d\u0430\u0448\u0438 \u0444\u0440\u0435\u043d\u0434\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-355371","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=355371"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/355371\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=355371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=355371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=355371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}