{"id":470497,"date":"2025-08-12T21:00:35","date_gmt":"2025-08-12T21:00:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=470497"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=470497","title":{"rendered":"<span>Expression Templates<\/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>\u00ab\u041b\u0435\u043d\u044c\u2011\u043c\u0430\u0442\u0443\u0448\u043a\u0430 \u0432\u043f\u0435\u0440\u0451\u0434 \u043d\u0430\u0441 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c\u00bb<\/p>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u00a0\u0442\u0435\u0445\u043d\u0438\u043a\u0435 \u00abExpression Templates\u00bb \u0438 \u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/orefkov\/simstr\" rel=\"noopener noreferrer nofollow\">simstr<\/a> (<a href=\"https:\/\/habr.com\/ru\/articles\/935590\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a>). \u0412\u043a\u0440\u0430\u0442\u0446\u0435\u00a0\u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0431\u0435\u0437\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u00ab\u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f\u00bb, \u0442\u0438\u043f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u00a0\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u0435\u00a0\u043f\u0440\u0430\u0432\u0434\u0430\u00a0\u043b\u0438? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f<\/h2>\n<p>\u041a\u0430\u043a\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u00a0\u2014 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u00bb. \u0418\u043c\u0435\u043d\u043d\u043e \u043b\u0435\u043d\u044c \u0442\u043e\u043b\u043a\u0430\u0435\u0442 \u043d\u0430\u0441 \u043d\u0430\u00a0\u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0410\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c\u00a0\u2014 \u0432\u043e\u043b\u0435\u0439\u2011\u043d\u0435\u0432\u043e\u043b\u0435\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0435\u0433\u043e \u00ab\u043e\u0434\u0443\u0448\u0435\u0432\u043b\u044f\u0442\u044c\u00bb \u0438 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u0441\u044f \u043e\u00a0\u043d\u0451\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u00a0\u0437\u043d\u0430\u044e, \u043a\u0430\u043a\u00a0\u0443\u00a0\u0432\u0430\u0441, \u0430\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u0441\u0435\u0440\u0434\u0446\u0435 \u043a\u0440\u043e\u0432\u044c\u044e \u043e\u0431\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443, \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0431\u0435\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u00a0\u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0437\u0430\u0437\u0440\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0442\u0438\u043a\u0438 \u0438 \u0431\u0435\u0441\u0442\u043e\u043b\u043a\u0443 \u0433\u043e\u043d\u044f\u0442\u044c \u0442\u0443\u0434\u0430\u2011\u0441\u044e\u0434\u0430 \u0431\u0430\u0439\u0442\u0438\u043a\u0438. <em>\u0422\u0430\u043a\u0443\u044e\u00a0\u043b\u0438\u0447\u043d\u0443\u044e \u043d\u0435\u043f\u0440\u0438\u044f\u0437\u043d\u044c \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u044e, \u0434\u0430\u0436\u0435 \u043a\u0443\u0448\u0430\u0442\u044c \u043d\u0435\u00a0\u043c\u043e\u0433\u0443<\/em>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 struct vec3 {     double x_, y_, z_;     vec3(double _x, double _y, double _z) : x_(_x), y_(_y), z_(_z) {         std::cout &lt;&lt; \"Construct vec3, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     double x() const {return x_;}     double y() const {return y_;}     double z() const {return z_;} };  \/\/ \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f vec3 operator+(const vec3&amp; a, const vec3&amp; b) {     return {a.x_ + b.x_, a.y_ + b.y_, a.z_ + b.z_}; } \/\/ \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f vec3 operator*(const vec3&amp; a, double m) {     return {a.x_ * m, a.y_ * m, a.z_ * m}; }  int main() {     vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     \/\/ \u0410\u043f\u043e\u0444\u0435\u043e\u0437 - \u043c\u043e\u0436\u043d\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f     vec3 result = a * 10.1 + b * 3.2 + c * 1.2;     std::cout &lt;&lt; \"&amp;result = \" &lt;&lt; &amp;result &lt;&lt; \", x=\" &lt;&lt; result.x() &lt;&lt; \", y=\" &lt;&lt; result.y() &lt;&lt; \", z=\" &lt;&lt; result.z() &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 24\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u0412\u0441\u0451 \u0432\u043e\u0442 \u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a\u00a0\u043f\u043e\u00a0\u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u044b\u0442\u043b\u0438\u0432\u043e\u043c\u0443 \u0443\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0430\u00a0\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u00ab\u0443\u043d\u0443\u0442\u0440\u0435\u00bb \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u00a0\u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u0412\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u00a0\u043c\u043e\u0438\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438:<\/p>\n<pre><code>Construct vec3, this=000000CE8C76F468, x=1, y=2, z=3 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 a Construct vec3, this=000000CE8C76F450, x=4, y=5, z=6 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 b Construct vec3, this=000000CE8C76F438, x=7, y=8, z=9 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 c Construct vec3, this=000000CE8C76F408, x=8.4, y=9.6, z=10.8 \/\/ \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 c \u043d\u0430 1.2 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 1 Construct vec3, this=000000CE8C76F3D8, x=12.8, y=16, z=19.2 \/\/ \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 b \u043d\u0430 3.2 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 2 Construct vec3, this=000000CE8C76F3C0, x=10.1, y=20.2, z=30.3 \/\/ \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 a \u043d\u0430 10.1 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 3 Construct vec3, this=000000CE8C76F3F0, x=22.9, y=36.2, z=49.5 \/\/ \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 2 \u0438 3 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 4 Construct vec3, this=000000CE8C76F420, x=31.3, y=45.8, z=60.3 \/\/ \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 4 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &amp;result = 000000CE8C76F420, x=31.3, y=45.8, z=60.3<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0443 \u043d\u0430\u0441 \u0432 \u0445\u043e\u0434\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0436 4 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043b\u0430\u0441\u0441 <code>vec3<\/code> \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c, \u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0451 \u0436\u0435 \u0431\u044b\u043b\u0438 \u0431\u044b \u0442\u0430\u043a\u0438\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">    vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     vec3 result = {       a.x_ * 10.1 + b.x_ * 3.2 + c.x_ * 1.2,       a.y_ * 10.1 + b.y_ * 3.2 + c.y_ * 1.2,       a.z_ * 10.1 + b.z_ * 3.2 + c.z_ * 1.2     };<\/code><\/pre>\n<p>\u0410\u00a0\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043b\u0438\u00a0\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0443\u00a0\u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0447\u0435\u043c\u2011\u0442\u043e <code>std::string<\/code>, <em>\u0441\u043c\u0435\u043a\u0430\u0435\u0448\u044c<\/em>?:\u2011)<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u00a0\u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434\u00a0\u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 1, \u0430\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u0442\u0430\u043a\u00a0\u0436\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 2?<\/p>\n<p>\u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043d\u0430\u00a0\u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0441\u0440\u043e\u043a, \u0441\u00a0\u0442\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u043e\u0441\u044c, \u043c\u044b\u00a0\u0431\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043b\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e template&lt;typename T&gt; struct vec3_op {     T t_;     double x() const {return t_.x();}     double y() const {return t_.y();}     double z() const {return t_.z();} }; \/\/ \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 struct vec3 {     double x_, y_, z_;     vec3(double _x, double _y, double _z) : x_(_x), y_(_y), z_(_z) {         std::cout &lt;&lt; \"Construct vec3, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     \/\/ \u041d\u0430\u0443\u0447\u0438\u043c \u043d\u0430\u0448 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     template&lt;typename T&gt;     vec3(const vec3_op&lt;T&gt;&amp; init) :  x_(init.x()), y_(init.y()), z_(init.z()) {         std::cout &lt;&lt; \"Construct vec3 from init, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     double x() const {return x_;}     double y() const {return y_;}     double z() const {return z_;} }; \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 template&lt;typename A, typename B&gt; struct vec3_sum_op {     vec3_sum_op(const A&amp; a, const B&amp; b) : a_(a), b_(b){}     const A&amp; a_;     const B&amp; b_;     double x() const {return a_.x() + b_.x();}     double y() const {return a_.y() + b_.y();}     double z() const {return a_.z() + b_.z();} }; \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A&gt; struct vec3_mul_op {     vec3_mul_op(const A&amp; a, double b) : a_(a), b_(b){}     const A&amp; a_;     double b_;     double x() const {return a_.x() * b_;}     double y() const {return a_.y() * b_;}     double z() const {return a_.z() * b_;} }; \/\/ \u0418 \u0432\u043e\u0442 \u043e\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \/\/ \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0441\u0443\u043c\u043c\u0443 \/\/ \u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. template&lt;typename A, typename B&gt; vec3_op&lt;vec3_sum_op&lt;A, B&gt;&gt; operator+(const vec3_op&lt;A&gt;&amp; a, const vec3_op&lt;B&gt;&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;A, B&gt;&gt;{vec3_sum_op&lt;A, B&gt;{a.t_, b.t_}}; } \/\/ \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e, \/\/ \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \/\/ \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A&gt; vec3_op&lt;vec3_mul_op&lt;A&gt;&gt; operator*(const vec3_op&lt;A&gt;&amp; a, double b) {     return vec3_op&lt;vec3_mul_op&lt;A&gt;&gt;{vec3_mul_op&lt;A&gt;{a.t_, b}}; } \/\/ \u041d\u0443 \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c template&lt;typename A&gt; auto operator+(const vec3_op&lt;A&gt;&amp; a, const vec3&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;A, vec3&gt;&gt;{{a.t_, b}}; } \/\/ \u0418 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 template&lt;typename A&gt; auto operator+(const vec3&amp; a, const vec3_op&lt;A&gt;&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;vec3, A&gt;&gt;{{a, b.t_}}; } \/\/ \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \/\/ \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043d\u0435 \u0432\u0435\u043a\u0442\u043e\u0440, \u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. auto operator+(const vec3&amp; a, const vec3&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;vec3, vec3&gt;&gt;{{a, b}}; } auto operator*(const vec3&amp; a, double b) {     return vec3_op&lt;vec3_mul_op&lt;vec3&gt;&gt;{{a, b}}; } \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 - \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a \u043d\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \/\/ \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0436\u0435 operator+ \u0438 operator*  int main() {     vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     vec3 result = a * 10.1 + b * 3.2 + c * 1.2;     std::cout &lt;&lt; \"&amp;result = \" &lt;&lt; &amp;result &lt;&lt; \", x=\" &lt;&lt; result.x() &lt;&lt; \", y=\" &lt;&lt; result.y() &lt;&lt; \", z=\" &lt;&lt; result.z() &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code>Construct vec3, this=00000069DE8FF6E8, x=1, y=2, z=3 Construct vec3, this=00000069DE8FF6D0, x=4, y=5, z=6 Construct vec3, this=00000069DE8FF6B8, x=7, y=8, z=9 Construct vec3 from init, this=00000069DE8FF6A0, x=31.3, y=45.8, z=60.3 \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 &amp;result = 00000069DE8FF6A0, x=31.3, y=45.8, z=60.3<\/code><\/pre>\n<p>\u0423\u0440\u0430! \u0417\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u041a\u0430\u043a\u00a0\u0432\u0438\u0434\u0438\u043c, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u0441\u0451 \u0441\u0440\u0430\u0437\u0443 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435! \u0421\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0443\u043c\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0442\u0440\u0443\u0434 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443, \u0430\u00a0\u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u0439\u00a0\u2014 \u043d\u0438\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u00a0\u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u0438 \u0436\u0438\u0437\u043d\u044c \u0441\u0435\u0431\u0435\u00a0\u2014 \u043c\u044b \u043f\u043e\u00a0\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u00a0\u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u0430\u043a\u00a0\u0440\u0430\u043d\u044c\u0448\u0435. \u041a\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">vec3 result = (a + b * 3.0) * 12.3 + c * 11 + (c * 1.1 + a + b);<\/code><\/pre>\n<p>\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>Construct vec3, this=00000074B58FF288, x=1, y=2, z=3 Construct vec3, this=00000074B58FF270, x=4, y=5, z=6 Construct vec3, this=00000074B58FF258, x=7, y=8, z=9 Construct vec3 from init, this=00000074B58FF240, x=249.6, y=312.9, z=376.2 &amp;result = 00000074B58FF240, x=249.6, y=312.9, z=376.2<\/code><\/pre>\n<p>\u041f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u0430\u0432\u0434\u0430, \u0437\u0434\u043e\u0440\u043e\u0432\u043e?<\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u0440\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u0435\u043c, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u00a0\u0441\u0447\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u00ab\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 \u0441\u0432\u043e\u0438 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b (\u043a\u043e\u043f\u0438\u0435\u0439 \u0438\u043b\u0438\u00a0\u043f\u043e\u00a0\u0441\u0441\u044b\u043b\u043a\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u00a0\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0440\u0443\u0442 \u0434\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u2011\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u043d\u043e\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440.<\/p>\n<\/li>\n<li>\n<p>\u00ab\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e\u00bb \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u00a0\u0446\u0435\u043b\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0418 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/435\/72f\/c0a\/43572fc0a4ca5e1a35d6250a5a985f14.png\" alt=\"\u0414\u0435\u0440\u0435\u0432\u043e-\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\" title=\"\u0414\u0435\u0440\u0435\u0432\u043e-\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\" width=\"1043\" height=\"520\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/435\/72f\/c0a\/43572fc0a4ca5e1a35d6250a5a985f14.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/435\/72f\/c0a\/43572fc0a4ca5e1a35d6250a5a985f14.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0435\u0440\u0435\u0432\u043e-\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0442\u043e-\u0442\u043e\u00a0\u0441\u043a\u0430\u0436\u0435\u0442\u00a0\u2014 \u00ab\u0438 \u0447\u0442\u043e, \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043d\u0430\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435\u00a0\u0432\u0435\u043b\u0438\u043a\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430. \u0410\u00a0\u0435\u0441\u043b\u0438 <code>std::cout<\/code> \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u0441\u0451 \u0438 \u0442\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u00bb.<\/p>\n<p>\u041e\u0442\u0432\u0435\u0447\u0443, \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b \u0438 \u043f\u0440\u043e\u0441\u0442\u044b, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0447\u0435\u043c \u0441\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\u2011\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0441\u044b\u043b\u043a\u0438. \u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445\u00a0\u2014 \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0442\u0430\u043c \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432), \u0430\u00a0\u0432\u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\u00a0\u2014 \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430. \u0415\u0441\u043b\u0438 \u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e \u0434\u0430, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 <a href=\"https:\/\/godbolt.org\/z\/Tef4v66cK\" rel=\"noopener noreferrer nofollow\">\u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/a>, \u043d\u043e\u00a0\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043b\u0438\u00a0\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b), \u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <a href=\"https:\/\/godbolt.org\/z\/s8K9z1fbv\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u0441\u043c\u043e\u0436\u0435\u0442<\/a>\u00a0\u2014 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<h3>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043d\u044f\u043b\u0438 \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f, \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c, \u043c\u043e\u0436\u043d\u043e\u00a0\u043b\u0438 \u0435\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u043f\u0440\u043e\u0449\u0435? \u0412\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044f \u0435\u0451 \u043d\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438,\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438\u00a0\u0431\u044b \u043d\u0430\u043c \u043d\u0430\u0434\u043e\u00a0\u0431\u044b\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u0441\u0430\u043c \u0448\u0430\u0431\u043b\u043e\u043d <code>vec3_op<\/code>. \u041f\u043e\u00a0\u0441\u0443\u0442\u0438, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0430\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440. \u041d\u0443 \u0438 \u0442\u0430\u043a\u0436\u0435 \u0435\u0433\u043e \u0446\u0435\u043b\u044c\u00a0\u2014 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f\u00a0\u0442\u0438\u043f\u043e\u0432 \u0432\u00a0\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 <code>operator+<\/code> \u0438 <code>operator*<\/code>, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u00a0\u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0442\u0438\u043f\u0430\u043c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c <code>vec3_op<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0438 \u0441\u0430\u043c\u0438 <code>vec3_sum_op<\/code>, <code>vec3_mul_op<\/code>, <code>vec3<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0438 \u0441\u0430\u043c\u0438 \u043f\u043e\u00a0\u0441\u0435\u0431\u0435 \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u2011\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0442\u0438\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u0432\u00a0\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 \u0442\u0435\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u2011\u0447\u043b\u0435\u043d\u044b <code>double x(), double y(), double z()<\/code>. \u0414\u043e\u00a0\u0421++20\u00a0\u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SFINAE\" rel=\"noopener noreferrer nofollow\">SFINAE<\/a>, \u0430\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u00a0C++20\u00a0\u2014 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f\u00a0\u0421++17:<\/p>\n<pre><code class=\"cpp\">\/\/ \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043b\u0438 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0447\u043b\u0435\u043d\u044b template&lt;typename T, typename = void, typename = void, typename = void&gt; struct has_vec_op : std::false_type{};  template&lt;typename T&gt; struct has_vec_op&lt;T,     std::enable_if_t&lt;std::is_same_v&lt;double, decltype(std::declval&lt;const T&amp;&gt;().x())&gt;&gt;,     std::enable_if_t&lt;std::is_same_v&lt;double, decltype(std::declval&lt;const T&amp;&gt;().y())&gt;&gt;,     std::enable_if_t&lt;std::is_same_v&lt;double, decltype(std::declval&lt;const T&amp;&gt;().z())&gt;&gt;&gt; : std::true_type{};  \/\/ \u041d\u0443 \u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0442\u0438\u043f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c x(), y(), z(); template&lt;typename T&gt; using is_vec_op_t = std::enable_if_t&lt;has_vec_op&lt;T&gt;::value&gt;;  struct vec3 {     double x_, y_, z_;     vec3(double _x, double _y, double _z) : x_(_x), y_(_y), z_(_z) {         std::cout &lt;&lt; \"Construct vec3, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     \/\/ \u041d\u0430\u0443\u0447\u0438\u043c \u043d\u0430\u0448 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u044e\u0431\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c x(), y(), z()     template&lt;typename T, typename = is_vec_op_t&lt;T&gt;&gt;     vec3(const T&amp; init) : x_(init.x()), y_(init.y()), z_(init.z()) {         std::cout &lt;&lt; \"Construct vec3 from init, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     double x() const {return x_;}     double y() const {return y_;}     double z() const {return z_;} };  \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 template&lt;typename A, typename B&gt; struct vec3_sum_op {     vec3_sum_op(const A&amp; a, const B&amp; b) : a_(a), b_(b){}     const A&amp; a_;     const B&amp; b_;     double x() const {return a_.x() + b_.x();}     double y() const {return a_.y() + b_.y();}     double z() const {return a_.z() + b_.z();} };  \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A&gt; struct vec3_mul_op {     vec3_mul_op(const A&amp; a, double b) : a_(a), b_(b){}     const A&amp; a_;     double b_;     double x() const {return a_.x() * b_;}     double y() const {return a_.y() * b_;}     double z() const {return a_.z() * b_;} };  \/\/ \u0418 \u0432\u043e\u0442 \u043e\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \/\/ x(), y(), z(), \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0441\u0443\u043c\u043c\u0443 \u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. template&lt;typename A, typename B, typename = is_vec_op_t&lt;A&gt;, typename = is_vec_op_t&lt;B&gt;&gt; vec3_sum_op&lt;A, B&gt; operator+(const A&amp; a, const B&amp; b) {     return {a, b}; }  \/\/ \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0442\u0438\u043f\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \/\/ x(), y(), z(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A, typename = is_vec_op_t&lt;A&gt;&gt; vec3_mul_op&lt;A&gt; operator*(const A&amp; a, double b) {     return {a, b}; } \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 - \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a \u043d\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \/\/ \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0436\u0435 operator+ \u0438 operator*. \/\/ \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \/\/ \u0442\u0438\u043f\u0430 vec3, \u0442\u0430\u043a \u043a\u0430\u043a vec3 \u0441\u0430\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044e is_vec_op_v \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a \u044d\u0442\u0438\u043c \/\/ \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430\u043c  int main() {     vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     vec3 result = a * 10.1 + b * 3.2 + c * 1.2;     std::cout &lt;&lt; \"&amp;result = \" &lt;&lt; &amp;result &lt;&lt; \", x=\" &lt;&lt; result.x() &lt;&lt; \", y=\" &lt;&lt; result.y() &lt;&lt; \", z=\" &lt;&lt; result.z() &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0410\u00a0\u044d\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u00a0\u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430\u043c\u0438 \u0434\u043b\u044f\u00a0C++20:<\/p>\n<pre><code class=\"cpp\">\/\/ \u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f template&lt;typename A&gt; concept VecOp = requires(const A&amp; a) {     \/\/ \u042d\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u044d\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f     { a.x() } -&gt; std::same_as&lt;double&gt;;     { a.y() } -&gt; std::same_as&lt;double&gt;;     { a.z() } -&gt; std::same_as&lt;double&gt;; };  struct vec3 {     double x_, y_, z_;     vec3(double _x, double _y, double _z) : x_(_x), y_(_y), z_(_z) {         std::cout &lt;&lt; \"Construct vec3, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     \/\/ \u041d\u0430\u0443\u0447\u0438\u043c \u043d\u0430\u0448 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u044e\u0431\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 VecOp     template&lt;VecOp T&gt;     vec3(const T&amp; init) : x_(init.x()), y_(init.y()), z_(init.z()) {         std::cout &lt;&lt; \"Construct vec3 from init this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     double x() const {return x_;}     double y() const {return y_;}     double z() const {return z_;} };  \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 template&lt;typename A, typename B&gt; struct vec3_sum_op {     vec3_sum_op(const A&amp; a, const B&amp; b) : a_(a), b_(b){}     const A&amp; a_;     const B&amp; b_;     double x() const {return a_.x() + b_.x();}     double y() const {return a_.y() + b_.y();}     double z() const {return a_.z() + b_.z();} };  \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A&gt; struct vec3_mul_op {     vec3_mul_op(const A&amp; a, double b) : a_(a), b_(b){}     const A&amp; a_;     double b_;     double x() const {return a_.x() * b_;}     double y() const {return a_.y() * b_;}     double z() const {return a_.z() * b_;} };  \/\/ \u0418 \u0432\u043e\u0442 \u043e\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 \/\/ VecOp \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0441\u0443\u043c\u043c\u0443 \u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. template&lt;VecOp A, VecOp B&gt; vec3_sum_op&lt;A, B&gt; operator+(const A&amp; a, const B&amp; b) {     return {a, b}; }  \/\/ \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0442\u0438\u043f\u0430, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0435\u0433\u043e \/\/ \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 VecOp, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;VecOp A&gt; vec3_mul_op&lt;A&gt; operator*(const A&amp; a, double b) {     return {a, b}; } \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 - \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a \u043d\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \/\/ \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0436\u0435 operator+ \u0438 operator*. \/\/ \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \/\/ \u0442\u0438\u043f\u0430 vec3, \u0442\u0430\u043a \u043a\u0430\u043a vec3 \u0441\u0430\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 VecOp \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a \u044d\u0442\u0438\u043c \/\/ \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430\u043c  int main() {     vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     vec3 result = a * 10.1 + b * 3.2 + c * 1.2;     std::cout &lt;&lt; \"&amp;result = \" &lt;&lt; &amp;result &lt;&lt; \", x=\" &lt;&lt; result.x() &lt;&lt; \", y=\" &lt;&lt; result.y() &lt;&lt; \", z=\" &lt;&lt; result.z() &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443\u044f\u0441\u044c \u044d\u0442\u0438\u043c\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Expression Templates \u0434\u043b\u044f\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u00a0\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>std::ranges<\/code>, \u0434\u043b\u044f\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u00ab\u043b\u0435\u043d\u0438\u0432\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439\u00bb. \u041e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u0430\u043a\u00a0\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u00ab\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e\u00bb \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0414\u043b\u044f\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0432\u00a0simstr.<\/p>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 simstr<\/h2>\n<p>\u0412\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/orefkov\/simstr\" rel=\"noopener noreferrer nofollow\">simstr<\/a> \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u00abexpression templates\u00bb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a. <\/p>\n<h3>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 std::string<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u043e \u0442\u0430\u043c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e <code>std::string<\/code>, <code>std::string_view<\/code> \u0438 C\u2011\u0441\u0442\u0440\u043e\u043a\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">std::string elem(const std::string&amp; s1, const std::string&amp; s2) {     return \"&lt;\" + s1 + \" class=\\\"\" + s2 + \"\\\"&gt;\"; }  int main(int argc, char** argv) {     auto r = elem(\"div\", \"block\");     size_t l = r.length(), c = r.capacity();     std::cout &lt;&lt; r &lt;&lt; \", l = \" &lt;&lt; l &lt;&lt; \", c = \" &lt;&lt; c &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0412\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>elem<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0439.<br \/>\u041f\u0435\u0440\u0432\u0430\u044f (<code>\"&lt;\" + s1<\/code>) \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>std::string<\/code>, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f\u00a0\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u043b\u0438\u0431\u043e \u0432\u043e\u00a0\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u043f\u0440\u0438\u00a0SSO,\u00a0\u043b\u0438\u0431\u043e \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f) \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437\u00a0\u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u00a0\u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e \u0434\u0440\u0443\u0433 \u0437\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u043c. \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u043d\u043e\u0432\u044b\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>std::string<\/code>, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u00a0\u2014 \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 r\u2011value, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u0443\u044e, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0451 \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0412\u0430\u0440\u0438\u0430\u043d\u0442, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 C-\u0441\u0442\u0440\u043e\u043a\u0438 std::string operator+(std::string&amp;&amp; __lhs, const char* __rhs) {     return std::move(__lhs.append(__rhs)); }<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u0441\u0435\u0432\u0434\u043e\u2011\u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"cpp\">std::string elem(const std::string&amp; s1, const std::string&amp; s2) {     std::string t1 = \"&lt;\" + s1;     t1 += \" class=\\\"\";     std::string t2 = std::move(t1);     t2 += s2;     std::string t3 = std::move(t3);     t3 += \"\\\"&gt;\";     return std::move(t3); }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u00a0\u0441\u043e\u0432\u0441\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u00a0\u2014 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e\u00a0\u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0443\u0444\u0435\u0440. \u0423\u00a0\u0432\u0441\u0435\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0445\u043e\u0442\u044f \u0432\u0441\u0435 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u00ab\u043e\u043f\u0443\u0441\u0442\u043e\u0448\u0435\u043d\u044b\u00bb \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>\u041a\u0430\u043a\u00a0\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e? \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">std::string elem(const std::string&amp; s1, const std::string&amp; s2) {     std::string res;     res.reserve(s1.size() + s2.size() + 11);     res = \"&lt;\";     res += s1;     res += \" class=\\\"\";     res += s2;     res += \"\\\"&gt;\";     return res; }<\/code><\/pre>\n<p>\u0412\u00a0\u0442\u0430\u043a\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0443\u0436\u0435 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0443\u0436\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435\u00a0\u0432\u043b\u0435\u0437\u0435\u0442 \u0432\u043e\u00a0\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f, \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0\u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<h3>\u041f\u043e\u0434\u0445\u043e\u0434 simstr<\/h3>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043b \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0438 \u0435\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0438\u0448\u0435\u043c, \u043a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 1, \u0430\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 2.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ul>\n<li>\n<p>\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432\u00a0\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u00a0simstr \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0435\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u044f \u043d\u0430\u0437\u0432\u0430\u043b \u00ab\u0421\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u00a0\u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0423\u00a0\u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f<\/p>\n<ul>\n<li>\n<p><code>typename symb_type<\/code>\u00a0\u2014 \u0437\u0430\u0434\u0430\u0451\u0442 \u0442\u0438\u043f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 <code>size_t length() const<\/code>\u00a0\u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 <code>symb_type* place(symb_type* ptr) const<\/code>\u00a0\u2014 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432\u00a0\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">template&lt;typename A&gt; concept StrExpr = requires(const A&amp; a) {     typename A::symb_type;     { a.length() } -&gt; std::convertible_to&lt;size_t&gt;;     { a.place(std::declval&lt;typename A::symb_type*&gt;()) } -&gt; std::same_as&lt;typename A::symb_type*&gt;; };<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0442\u0438\u043f\u044b \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432\u00a0simstr, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0434\u0432\u0443\u0445 \u043b\u044e\u0431\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <code>strexprjoin<\/code>. \u041e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u00a0\u0434\u0432\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043b\u0438\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u0438\u0445 \u0434\u043b\u0438\u043d, \u0430\u00a0\u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\u00a0\u2014 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0435, \u043f\u043e\u0442\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">template&lt;StrExpr A, StrExprForType&lt;typename A::symb_type&gt; B&gt; struct strexprjoin {     using symb_type = typename A::symb_type;     const A&amp; a;     const B&amp; b;     constexpr strexprjoin(const A&amp; a_, const B&amp; b_) : a(a_), b(b_){}     \/\/ \u0421\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u043b\u0438\u043d\u044b     constexpr size_t length() const noexcept {         return a.length() + b.length();     }     \/\/ \u0420\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435, \u043f\u043e\u0442\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435     constexpr symb_type* place(symb_type* p) const noexcept {         return b.place(a.place(p));     } };  template&lt;StrExpr A, StrExprForType&lt;typename A::symb_type&gt; B&gt; inline auto operator+(const A&amp; a, const B&amp; b) {     return strexprjoin&lt;A, B&gt;{a, b}; }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a <code>strexprjoin<\/code> \u0441\u0430\u043c \u0442\u043e\u0436\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 <code>StrExpr<\/code>, \u043a\u00a0\u043d\u0435\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u043e\u0442\u00a0\u0436\u0435 <code>operator+<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0441\u0442\u0440\u043e\u044f\u0449\u0435\u0435 \u00ab\u0434\u0435\u0440\u0435\u0432\u043e\u00bb \u0438\u0437\u00a0\u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432\u2011\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">\/\/ operator\"\"_ss \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 const char \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 simple_str_nt&lt;char&gt;. \/\/ \u0422\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \/\/ \u0432 strexprjoin \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c ssa (simple_str&lt;char&gt;).  stringa elem(ssa s1, ssa s2) {     return \"&lt;\"_ss + s1 + \" class=\\\"\"_ss + s2 + \"\\\"&gt;\"_ss; }  int main(int argc, char** argv) {     auto r = elem(\"div\", \"block\");     std::cout &lt;&lt; r &lt;&lt; \", l = \" &lt;&lt; r.length() &lt;&lt; \"\\n\";     return 0; } <\/code><\/pre>\n<p>\u0412\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>\"&lt;\"_ss + s1 + \" class=\"\"_ss + s2 + \"\"&gt;\"_ss<\/code>. \u0415\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u00a0\u044d\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 (\u0437\u0430\u043f\u0438\u0448\u0443 \u201e\u043b\u0435\u0441\u0435\u043d\u043a\u043e\u0439\u201c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435\u00a0\u0431\u044b\u043b\u043e)<\/p>\n<pre><code>simstr::strexprjoin&lt;     simstr::strexprjoin&lt;         simstr::strexprjoin&lt;             simstr::strexprjoin&lt;simstr::simple_str_nt&lt;char&gt;,simstr::simple_str&lt;char&gt;&gt;,             simstr::simple_str_nt&lt;char&gt;&gt;,         simstr::simple_str&lt;char&gt;&gt;,     simstr::simple_str_nt&lt;char&gt; &gt;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e \u043f\u043e\u00a0\u0441\u0435\u0431\u0435 \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e, \u043e\u043d\u043e \u0437\u043d\u0430\u0435\u0442 \u00ab\u043a\u0430\u043a\u00bb, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442 \u00ab\u043a\u0443\u0434\u0430\u00bb. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442\u2011\u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a. \u0412\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 <code>stringa<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412\u00a0simstr \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043b\u0430\u0434\u0435\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u043e\u0442 <code>str_storable<\/code> \u0438 \u0443\u043c\u0435\u044e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u2011\u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u2011\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434 <code>length()<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0417\u0430\u0442\u0435\u043c \u043e\u043d \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434 <code>place()<\/code>. \u041d\u0443 \u0438 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u00a0\u043a\u043e\u043d\u0446\u0435 0.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/435\/018\/769\/4350187696c8ea9bc099718d49e697dd.png\" alt=\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c\" title=\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c\" width=\"1395\" height=\"383\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/435\/018\/769\/4350187696c8ea9bc099718d49e697dd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/435\/018\/769\/4350187696c8ea9bc099718d49e697dd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (<code>lstring<\/code>) \u043a\u0440\u043e\u043c\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u0435\u0449\u0451 \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 <code>+=<\/code>, <code>change<\/code>, <code>prepend<\/code>, <code>insert<\/code> \u0438\u00a0\u0442.\u00a0\u043f.. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442\u00a0\u0436\u0435\u00a0\u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u0430, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f\u00a0\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.<\/p>\n<h3>\u041d\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043b \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432\u00a0simstr, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0432\u00a0\u043d\u0435\u0451 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c. \u0412\u0435\u0434\u044c \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 <code>strexprjoin<\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 <code>StrExpr<\/code>, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 <code>operator+<\/code> \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043a\u0430\u043a\u0438\u043c\u0438\u2011\u0442\u043e \u0442\u0438\u043f\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u00a0\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f\u0445.<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c\u0438<\/h4>\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u00a0\u043b\u0438\u0448\u043d\u0438\u0445 <code>\"\"_ss<\/code> \u0432\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b.<\/p>\n<p><code>expr_literal_join<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u0439 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b. \u041f\u0440\u0438\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0434\u043b\u0438\u043d\u044b \u0432\u044b\u0434\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u0434\u043b\u0438\u043d \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430, \u0430\u00a0\u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0438\u00a0\u2014 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b. \u0414\u043b\u0438\u043d\u0430\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u00a0\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">template&lt;bool first, typename K, size_t N, typename A&gt; struct expr_literal_join {     using symb_type = K;     const K (&amp;str)[N + 1];     const A&amp; a;     constexpr size_t length() const noexcept {         return N + a.length();     }     constexpr symb_type* place(symb_type* p) const noexcept {         if constexpr (N != 0) {             if constexpr (first) {                 std::char_traits&lt;K&gt;::copy(p, str, N);                 return a.place(p + N);             } else {                 p = a.place(p);                 std::char_traits&lt;K&gt;::copy(p, str, N);                 return p + N;             }         } else {             return a.place(p);         }     } };<\/code><\/pre>\n<p>\u0412\u0440\u0443\u0447\u043d\u0443\u044e \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u00a0\u043d\u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 \u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ const_lit_for&lt;K, T&gt;::Count - \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f T \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u0442\u043d\u044b\u043c\u0438 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c\u0438 \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 K. \/\/ \u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0430\u0442\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \/\/ \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a \u044d\u0442\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 template&lt;StrExpr A, typename K = typename A::symb_type, typename T, size_t N = const_lit_for&lt;K, T&gt;::Count&gt; constexpr inline auto operator+(const A&amp; a, T&amp;&amp; s) {     return expr_literal_join&lt;false, K, (N - 1), A&gt;{s, a}; }  template&lt;StrExpr A, typename K = typename A::symb_type, typename T, size_t N = const_lit_for&lt;K, T&gt;::Count&gt; constexpr inline auto operator+(T&amp;&amp; s, const A&amp; a) {     return expr_literal_join&lt;true, K, (N - 1), A&gt;{s, a}; } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">stringa elem(ssa s1, ssa s2) {     return \"&lt;\" + s1 + \" class=\\\"\" + s2 + \"\\\"&gt;\"; }<\/code><\/pre>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435, \u0447\u0442\u043e\u00a0\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u0438\u043c\u0435\u0442\u044c\u00a0\u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u00a0\u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430, \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u0430\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u042d\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>expr_num<\/code> \u0438 <code>expr_real<\/code>. \u0414\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043f\u0440\u0438\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0434\u043b\u0438\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0435\u0433\u043e \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u00a0\u0441\u0432\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u0434\u043b\u0438\u043d\u0443. \u0417\u0430\u0442\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442 \u0438\u0437\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0418 \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0447\u0438\u0441\u043b\u043e\u00a0\u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0447\u0438\u0441\u043b\u043e template&lt;StrExpr A, FromIntNumber T&gt; inline constexpr auto operator+(const A&amp; a, T s) {     return strexprjoin_c&lt;A, expr_num&lt;typename A::symb_type, T&gt;&gt;{a, s}; } \/\/ \u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 template&lt;StrExpr A, FromIntNumber T&gt; inline constexpr auto operator+(T s, const A&amp; a) {     return strexprjoin_c&lt;A, expr_num&lt;typename A::symb_type, T&gt;, false&gt;{a, s}; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">stringa elem(ssa tag, ssa className, unsigned counter) {     return \"&lt;\" + tag + \" class=\\\"\" + className + \"\\\" id=\\\"elem\" + counter + \"\\\"&gt;\"; }<\/code><\/pre>\n<p>\u041a\u0430\u043a\u00a0\u0432 javascript, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e.<\/p>\n<h4>\u0414\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u0442\u043e-\u0442\u043e \u043e\u0434\u0438\u043d<\/h4>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u041d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u043e\u0436\u0438\u0442\u044c\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0438 \u0447\u0438\u0441\u043b\u043e, \u043d\u0430\u0434\u043e \u0447\u0442\u043e\u2011\u0442\u043e \u0438\u0437\u00a0\u043d\u0438\u0445 \u044f\u0432\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">\"test = \" + count;              \/\/ \u041d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \"test = \"_ss + count;           \/\/ \u0421\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, _ss \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0432 simple_str_nt \"test = \" + e_num&lt;char&gt;(count); \/\/ \u0421\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, e_num&lt;char&gt; - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 eea + \"test = \" + count;        \/\/ \u0421\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, eea \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0434\u0430\u044e\u0449\u0435\u0435 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443<\/code><\/pre>\n<h4>\u0423\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0411\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u00a0\u0441\u0442\u0440\u043e\u043a\u0435 \u0438\u043b\u0438\u00a0\u043e\u0434\u043d\u043e, \u0438\u043b\u0438\u00a0\u0434\u0440\u0443\u0433\u043e\u0435. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b <code>e_choice<\/code> \u0438 <code>e_if<\/code>.<\/p>\n<ul>\n<li>\n<p><code>e_choice(\u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 1, \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 2)<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f 1, \u0438\u043d\u0430\u0447\u0435 \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f 2<\/p>\n<\/li>\n<li>\n<p><code>e_if(\u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 1)<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f 1, \u0438\u043d\u0430\u0447\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">res = \"Column is \" + e_choice(col.name_.is_empty(), \"?column?\", col.name_) + \", value = \" + value; ... result = shost + e_if(!sserv.is_empty(), \":\" + sserv); ... r += \"E\" + e_if(adjusted_exponent &gt; 0, \"+\") + adjusted_exponent; ... it-&gt;second = type_name + \"(\" + precision + e_if(scale != 0, \",\"_ss + scale) + \")\";<\/code><\/pre>\n<h4>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/h4>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<ul>\n<li>\n<p><code>expr_spaces&lt;typename K, size_t N, size_t S = ' '&gt;{}<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u00a0N \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 S \u0442\u0438\u043f\u0430 K. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0415\u0441\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b<\/p>\n<ul>\n<li>\n<p><code>e_spca&lt;N&gt;()<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 N char \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><code>e_spcw&lt;N&gt;()<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 N wchar_t \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><code>expr_pad&lt;typename K&gt;{len, symbol}<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0437 <code>len<\/code> \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 <code>symbol<\/code> \u0442\u0438\u043f\u0430 K. len \u0438 symbol \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u0423\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c\u00a0\u2014 <code>e_c(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u0441\u0438\u043c\u0432\u043e\u043b)<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u043b\u0438\u044f\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b<\/h4>\n<p>\u0412\u00a0\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>e_join(\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \"\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\")<\/code>. \u042d\u0442\u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437\u00a0\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u00a0\u043e\u0434\u043d\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u00a0\u2014 \u043b\u044e\u0431\u043e\u0439, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 range for.<\/p>\n<pre><code class=\"cpp\">result = header + e_join(lines, \"\\n\") + footer;<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f\u00a0\u0437\u0430\u043c\u0435\u043d:<\/p>\n<ul>\n<li>\n<p><code>e_repl(\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \"\u041d\u0430\u0439\u0442\u0438\", \"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c\")<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u00ab\u041d\u0430\u0439\u0442\u0438\u00bb \u0432\u00a0\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u00ab\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c\u00bb. \u0421\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c\u0438 \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code>expr_replaced&lt;typename K&gt;{\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u041d\u0430\u0439\u0442\u0438, \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c)<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u041d\u0430\u0439\u0442\u0438 \u0432\u00a0\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c. \u0421\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u00a0\u0440\u0430\u043d\u0442\u0430\u0439\u043c<\/p>\n<\/li>\n<li>\n<p><code>e_repl_const_symbols(\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0441\u0438\u043c\u0432\u043e\u043b1, \u0437\u0430\u043c\u0435\u043d\u04301, ...)<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432\u00a0\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043c\u0435\u043d\u044b. \u0421\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f\u00a0\u0437\u0430\u043c\u0435\u043d\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u00a0\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code>expr_replace_symbols&lt;typename K, bool UseVectorForReplace = false&gt;{\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0432\u0435\u043a\u0442\u043e\u0440_\u0437\u0430\u043c\u0435\u043d)<\/code>\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0437\u00a0\u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0437\u0430\u043c\u0435\u043d \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0437\u0430\u043c\u0435\u043d\u044b. \u0421\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">result = header + e_repl(source, \"\\r\\n\", \"\\n\") + footer; ... script_text += \"'\" + e_repl(name, \"'\", \"\\\\'\") + \"'\" + e_choice(last, \"]\", \",\"); ... out += \"&lt;p&gt;\" + e_repl_const_symbols(text,     '\\\"', \"&amp;quot;\",     '&lt;', \"&amp;lt;\",     '\\'', \"&amp;#39;\",     '&amp;', \"&amp;amp;\") + \"&lt;\/p&gt;\";<\/code><\/pre>\n<h4>std::string \u0438 std::string_view<\/h4>\n<p>\u0414\u043b\u044f\u00a0\u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u00a0\u043d\u0438\u043c\u0438, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a\u00a0\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u00a0\u043d\u0438\u043c.<\/p>\n<pre><code>stringa func(std::string_view key, const std::string&amp; value) {     return \"Key is \"_ss + key + \", value is \" + value; }<\/code><\/pre>\n<h4>utf \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0412\u00a0simstr \u0432\u0441\u0435 \u0432\u043b\u0430\u0434\u0435\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u00a0\u0441\u0442\u0440\u043e\u043a \u0441\u00a0\u0434\u0440\u0443\u0433\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u044f \u0438\u0445 \u0438\u0437\u00a0UTF-8, UTF-16, UTF-32\u00a0\u0432\u00a0\u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443. \u0410\u00a0\u0434\u043b\u044f\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u00a0\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f\u0445 \u0441\u0442\u0440\u043e\u043a \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>e_utf&lt;\u0422\u0438\u043f\u0421\u0438\u043c\u0432\u043e\u043b\u0430&gt;(\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a)<\/code>. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437\u00a0\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u00a0\u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">stringa result = \"&lt; \" + e_utf&lt;char&gt;(utf16text) + \"&gt;\";<\/code><\/pre>\n<h3>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0432\u043e\u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/h3>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432\u00a0simstr \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e\u00a0\u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u00a0\u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 StrExpr, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u0412\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u00a0sqlite \u0432\u00a0\u0432\u0438\u0434\u0435 \u043f\u0430\u0440\u044b {\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0434\u043b\u0438\u043d\u0430} \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u00a0utf-16\u00a0\u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u00a0\u0432\u0438\u0434\u0435 base64\u00a0\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<p>\u0411\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"cpp\">struct expr_str_base64 {     using symb_type = u16s;     ssa text; \/\/ \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     size_t l; \/\/ \u0414\u043b\u0438\u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430     size_t length() const noexcept {         return l;     }     u16s* place(u16s* ptr) const noexcept;     expr_str_base64(ssa t); }; expr_str_base64::expr_str_base64(ssa t) : text(t) {     l = (text.len + 2) \/ 3 * 4; }  u16s* expr_str_base64::place(u16s* ptr) const noexcept {     static constexpr u8s alphabet[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/\";      const unsigned char* t = (const unsigned char*)text.str;      size_t i = 0;     if (text.len &gt; 2) {         for (; i &lt; text.len - 2; i += 3) {             *ptr++ = alphabet[(t[i] &gt;&gt; 2) &amp; 0x3F];             *ptr++ = alphabet[((t[i] &amp; 0x3) &lt;&lt; 4) | ((int)(t[i + 1] &amp; 0xF0) &gt;&gt; 4)];             *ptr++ = alphabet[((t[i + 1] &amp; 0xF) &lt;&lt; 2) | ((int)(t[i + 2] &amp; 0xC0) &gt;&gt; 6)];             *ptr++ = alphabet[t[i + 2] &amp; 0x3F];         }     }     if (i &lt; text.len) {         *ptr++ = alphabet[(t[i] &gt;&gt; 2) &amp; 0x3F];         if (i == (text.len - 1)) {             *ptr++ = alphabet[((t[i] &amp; 0x3) &lt;&lt; 4)];             *ptr++ = '=';         } else {             *ptr++ = alphabet[((t[i] &amp; 0x3) &lt;&lt; 4) | ((int)(t[i + 1] &amp; 0xF0) &gt;&gt; 4)];             *ptr++ = alphabet[((t[i + 1] &amp; 0xF) &lt;&lt; 2)];         }         *ptr++ = '=';     }     return ptr; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443, \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u00a0base64, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>expr_str_base64<\/code><\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">void addBlob(ssa v) {     vtText &lt;&lt; u\"{\\\"#\\\",87126200-3e98-44e0-b931-ccb1d7edc497,{1,{#base64:\" +       expr_str_base64(v) + u\"}}},\";     currentCol++; }<\/code><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430\u00a0\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0442\u0435\u043f\u0435\u0440\u044c Expression Templates \u0431\u0443\u0434\u0443\u0442 \u0434\u043b\u044f\u00a0\u0432\u0430\u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438, \u0430\u00a0\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u00a0simstr\u00a0\u2014 \u0443\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\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\/936468\/\"> https:\/\/habr.com\/ru\/articles\/936468\/<\/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>\u00ab\u041b\u0435\u043d\u044c\u2011\u043c\u0430\u0442\u0443\u0448\u043a\u0430 \u0432\u043f\u0435\u0440\u0451\u0434 \u043d\u0430\u0441 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c\u00bb<\/p>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u00a0\u0442\u0435\u0445\u043d\u0438\u043a\u0435 \u00abExpression Templates\u00bb \u0438 \u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/github.com\/orefkov\/simstr\" rel=\"noopener noreferrer nofollow\">simstr<\/a> (<a href=\"https:\/\/habr.com\/ru\/articles\/935590\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a>). \u0412\u043a\u0440\u0430\u0442\u0446\u0435\u00a0\u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0431\u0435\u0437\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u00ab\u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f\u00bb, \u0442\u0438\u043f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u00a0\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u0435\u00a0\u043f\u0440\u0430\u0432\u0434\u0430\u00a0\u043b\u0438? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f<\/h2>\n<p>\u041a\u0430\u043a\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u00a0\u2014 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u00bb. \u0418\u043c\u0435\u043d\u043d\u043e \u043b\u0435\u043d\u044c \u0442\u043e\u043b\u043a\u0430\u0435\u0442 \u043d\u0430\u0441 \u043d\u0430\u00a0\u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0410\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c\u00a0\u2014 \u0432\u043e\u043b\u0435\u0439\u2011\u043d\u0435\u0432\u043e\u043b\u0435\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0435\u0433\u043e \u00ab\u043e\u0434\u0443\u0448\u0435\u0432\u043b\u044f\u0442\u044c\u00bb \u0438 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u0441\u044f \u043e\u00a0\u043d\u0451\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u00a0\u0437\u043d\u0430\u044e, \u043a\u0430\u043a\u00a0\u0443\u00a0\u0432\u0430\u0441, \u0430\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u0441\u0435\u0440\u0434\u0446\u0435 \u043a\u0440\u043e\u0432\u044c\u044e \u043e\u0431\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443, \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0431\u0435\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u00a0\u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0437\u0430\u0437\u0440\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0442\u0438\u043a\u0438 \u0438 \u0431\u0435\u0441\u0442\u043e\u043b\u043a\u0443 \u0433\u043e\u043d\u044f\u0442\u044c \u0442\u0443\u0434\u0430\u2011\u0441\u044e\u0434\u0430 \u0431\u0430\u0439\u0442\u0438\u043a\u0438. <em>\u0422\u0430\u043a\u0443\u044e\u00a0\u043b\u0438\u0447\u043d\u0443\u044e \u043d\u0435\u043f\u0440\u0438\u044f\u0437\u043d\u044c \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u044e, \u0434\u0430\u0436\u0435 \u043a\u0443\u0448\u0430\u0442\u044c \u043d\u0435\u00a0\u043c\u043e\u0433\u0443<\/em>.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 struct vec3 {     double x_, y_, z_;     vec3(double _x, double _y, double _z) : x_(_x), y_(_y), z_(_z) {         std::cout &lt;&lt; \"Construct vec3, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     double x() const {return x_;}     double y() const {return y_;}     double z() const {return z_;} };  \/\/ \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f vec3 operator+(const vec3&amp; a, const vec3&amp; b) {     return {a.x_ + b.x_, a.y_ + b.y_, a.z_ + b.z_}; } \/\/ \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f vec3 operator*(const vec3&amp; a, double m) {     return {a.x_ * m, a.y_ * m, a.z_ * m}; }  int main() {     vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     \/\/ \u0410\u043f\u043e\u0444\u0435\u043e\u0437 - \u043c\u043e\u0436\u043d\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f     vec3 result = a * 10.1 + b * 3.2 + c * 1.2;     std::cout &lt;&lt; \"&amp;result = \" &lt;&lt; &amp;result &lt;&lt; \", x=\" &lt;&lt; result.x() &lt;&lt; \", y=\" &lt;&lt; result.y() &lt;&lt; \", z=\" &lt;&lt; result.z() &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 24\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u0412\u0441\u0451 \u0432\u043e\u0442 \u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a\u00a0\u043f\u043e\u00a0\u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u044b\u0442\u043b\u0438\u0432\u043e\u043c\u0443 \u0443\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0430\u00a0\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u00ab\u0443\u043d\u0443\u0442\u0440\u0435\u00bb \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u00a0\u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u0412\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u00a0\u043c\u043e\u0438\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438:<\/p>\n<pre><code>Construct vec3, this=000000CE8C76F468, x=1, y=2, z=3 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 a Construct vec3, this=000000CE8C76F450, x=4, y=5, z=6 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 b Construct vec3, this=000000CE8C76F438, x=7, y=8, z=9 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u0435\u043a\u0442\u043e\u0440 c Construct vec3, this=000000CE8C76F408, x=8.4, y=9.6, z=10.8 \/\/ \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 c \u043d\u0430 1.2 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 1 Construct vec3, this=000000CE8C76F3D8, x=12.8, y=16, z=19.2 \/\/ \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 b \u043d\u0430 3.2 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 2 Construct vec3, this=000000CE8C76F3C0, x=10.1, y=20.2, z=30.3 \/\/ \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 a \u043d\u0430 10.1 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 3 Construct vec3, this=000000CE8C76F3F0, x=22.9, y=36.2, z=49.5 \/\/ \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 2 \u0438 3 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 4 Construct vec3, this=000000CE8C76F420, x=31.3, y=45.8, z=60.3 \/\/ \u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 4 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &amp;result = 000000CE8C76F420, x=31.3, y=45.8, z=60.3<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0443 \u043d\u0430\u0441 \u0432 \u0445\u043e\u0434\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0436 4 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043b\u0430\u0441\u0441 <code>vec3<\/code> \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c, \u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0451 \u0436\u0435 \u0431\u044b\u043b\u0438 \u0431\u044b \u0442\u0430\u043a\u0438\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">    vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     vec3 result = {       a.x_ * 10.1 + b.x_ * 3.2 + c.x_ * 1.2,       a.y_ * 10.1 + b.y_ * 3.2 + c.y_ * 1.2,       a.z_ * 10.1 + b.z_ * 3.2 + c.z_ * 1.2     };<\/code><\/pre>\n<p>\u0410\u00a0\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043b\u0438\u00a0\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0443\u00a0\u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0447\u0435\u043c\u2011\u0442\u043e <code>std::string<\/code>, <em>\u0441\u043c\u0435\u043a\u0430\u0435\u0448\u044c<\/em>?:\u2011)<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u00a0\u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434\u00a0\u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 1, \u0430\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u0442\u0430\u043a\u00a0\u0436\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 2?<\/p>\n<p>\u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043d\u0430\u00a0\u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0441\u0440\u043e\u043a, \u0441\u00a0\u0442\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u043e\u0441\u044c, \u043c\u044b\u00a0\u0431\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043b\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e template&lt;typename T&gt; struct vec3_op {     T t_;     double x() const {return t_.x();}     double y() const {return t_.y();}     double z() const {return t_.z();} }; \/\/ \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 struct vec3 {     double x_, y_, z_;     vec3(double _x, double _y, double _z) : x_(_x), y_(_y), z_(_z) {         std::cout &lt;&lt; \"Construct vec3, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     \/\/ \u041d\u0430\u0443\u0447\u0438\u043c \u043d\u0430\u0448 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     template&lt;typename T&gt;     vec3(const vec3_op&lt;T&gt;&amp; init) :  x_(init.x()), y_(init.y()), z_(init.z()) {         std::cout &lt;&lt; \"Construct vec3 from init, this=\" &lt;&lt; this &lt;&lt; \", x=\" &lt;&lt; x() &lt;&lt; \", y=\" &lt;&lt; y() &lt;&lt; \", z=\" &lt;&lt; z() &lt;&lt;\"\\n\";     }     double x() const {return x_;}     double y() const {return y_;}     double z() const {return z_;} }; \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 template&lt;typename A, typename B&gt; struct vec3_sum_op {     vec3_sum_op(const A&amp; a, const B&amp; b) : a_(a), b_(b){}     const A&amp; a_;     const B&amp; b_;     double x() const {return a_.x() + b_.x();}     double y() const {return a_.y() + b_.y();}     double z() const {return a_.z() + b_.z();} }; \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A&gt; struct vec3_mul_op {     vec3_mul_op(const A&amp; a, double b) : a_(a), b_(b){}     const A&amp; a_;     double b_;     double x() const {return a_.x() * b_;}     double y() const {return a_.y() * b_;}     double z() const {return a_.z() * b_;} }; \/\/ \u0418 \u0432\u043e\u0442 \u043e\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \/\/ \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0441\u0443\u043c\u043c\u0443 \/\/ \u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. template&lt;typename A, typename B&gt; vec3_op&lt;vec3_sum_op&lt;A, B&gt;&gt; operator+(const vec3_op&lt;A&gt;&amp; a, const vec3_op&lt;B&gt;&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;A, B&gt;&gt;{vec3_sum_op&lt;A, B&gt;{a.t_, b.t_}}; } \/\/ \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e, \/\/ \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e - \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \/\/ \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e template&lt;typename A&gt; vec3_op&lt;vec3_mul_op&lt;A&gt;&gt; operator*(const vec3_op&lt;A&gt;&amp; a, double b) {     return vec3_op&lt;vec3_mul_op&lt;A&gt;&gt;{vec3_mul_op&lt;A&gt;{a.t_, b}}; } \/\/ \u041d\u0443 \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c template&lt;typename A&gt; auto operator+(const vec3_op&lt;A&gt;&amp; a, const vec3&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;A, vec3&gt;&gt;{{a.t_, b}}; } \/\/ \u0418 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 template&lt;typename A&gt; auto operator+(const vec3&amp; a, const vec3_op&lt;A&gt;&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;vec3, A&gt;&gt;{{a, b.t_}}; } \/\/ \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \/\/ \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043d\u0435 \u0432\u0435\u043a\u0442\u043e\u0440, \u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. auto operator+(const vec3&amp; a, const vec3&amp; b) {     return vec3_op&lt;vec3_sum_op&lt;vec3, vec3&gt;&gt;{{a, b}}; } auto operator*(const vec3&amp; a, double b) {     return vec3_op&lt;vec3_mul_op&lt;vec3&gt;&gt;{{a, b}}; } \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 - \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a \u043d\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \/\/ \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0436\u0435 operator+ \u0438 operator*  int main() {     vec3 a{1, 2, 3}, b{4, 5, 6}, c{7, 8, 9};     vec3 result = a * 10.1 + b * 3.2 + c * 1.2;     std::cout &lt;&lt; \"&amp;result = \" &lt;&lt; &amp;result &lt;&lt; \", x=\" &lt;&lt; result.x() &lt;&lt; \", y=\" &lt;&lt; result.y() &lt;&lt; \", z=\" &lt;&lt; result.z() &lt;&lt; \"\\n\";     return 0; }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code>Construct vec3, this=00000069DE8FF6E8, x=1, y=2, z=3 Construct vec3, this=00000069DE8FF6D0, x=4, y=5, z=6 Construct vec3, this=00000069DE8FF6B8, x=7, y=8, z=9 Construct vec3 from init, this=00000069DE8FF6A0, x=31.3, y=45.8, z=60.3 \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 &amp;result = 00000069DE8FF6A0, x=31.3, y=45.8, z=60.3<\/code><\/pre>\n<p>\u0423\u0440\u0430! \u0417\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u041a\u0430\u043a\u00a0\u0432\u0438\u0434\u0438\u043c, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u0441\u0451 \u0441\u0440\u0430\u0437\u0443 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435! \u0421\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0443\u043c\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0441\u00a0\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0442\u0440\u0443\u0434 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443, \u0430\u00a0\u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u0439\u00a0\u2014 \u043d\u0438\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u00a0\u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u0438 \u0436\u0438\u0437\u043d\u044c \u0441\u0435\u0431\u0435\u00a0\u2014 \u043c\u044b \u043f\u043e\u00a0\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u00a0\u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u0430\u043a\u00a0\u0440\u0430\u043d\u044c\u0448\u0435. \u041a\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">vec3 result = (a + b * 3.0) * 12.3 + c * 11 + (c * 1.1 + a + b);<\/code><\/pre>\n<p>\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>Construct vec3, this=00000074B58FF288, x=1, y=2, z=3 Construct vec3, this=00000074B58FF270, x=4, y=5, z=6 Construct vec3, this=00000074B58FF258, x=7, y=8, z=9 Construct vec3 from init, this=00000074B58FF240, x=249.6, y=312.9, z=376.2 &amp;result = 00000074B58FF240, x=249.6, y=312.9, z=376.2<\/code><\/pre>\n<p>\u041f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u0430\u0432\u0434\u0430, \u0437\u0434\u043e\u0440\u043e\u0432\u043e?<\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u0440\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u0435\u043c, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u00a0\u0441\u0447\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u00ab\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 \u0441\u0432\u043e\u0438 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b (\u043a\u043e\u043f\u0438\u0435\u0439 \u0438\u043b\u0438\u00a0\u043f\u043e\u00a0\u0441\u0441\u044b\u043b\u043a\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u00a0\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0440\u0443\u0442 \u0434\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u2011\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u043d\u043e\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440.<\/p>\n<\/li>\n<li>\n<p>\u00ab\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u00ab\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e\u00bb \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u00a0\u0446\u0435\u043b\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0418 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0435\u0440\u0435\u0432\u043e-\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0442\u043e-\u0442\u043e\u00a0\u0441\u043a\u0430\u0436\u0435\u0442\u00a0\u2014 \u00ab\u0438 \u0447\u0442\u043e, \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043d\u0430\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435\u00a0\u0432\u0435\u043b\u0438\u043a\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430. \u0410\u00a0\u0435\u0441\u043b\u0438 <code>std::cout<\/code> \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u0441\u0451 \u0438 \u0442\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u00bb.<\/p>\n<p>\u041e\u0442\u0432\u0435\u0447\u0443, \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b \u0438 \u043f\u0440\u043e\u0441\u0442\u044b, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0447\u0435\u043c \u0441\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\u2011\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0441\u044b\u043b\u043a\u0438. \u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445\u00a0\u2014 \u043a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u2011\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442<\/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-470497","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470497","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=470497"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470497\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=470497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=470497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=470497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}