{"id":327320,"date":"2022-01-10T08:50:55","date_gmt":"2022-01-10T08:50:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=327320"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=327320","title":{"rendered":"<span>\u0421++: \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043a \u043e\u0431\u043e\u0437\u0440\u0435\u043d\u0438\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">struct Row {     int field1 = 0;     int field2 = 0;     double qty = 0;     double sum = 0; };  std::vector&lt;Row> table1; ... \/\/ \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0447\u043d\u044e \u043a\u043e\u043b\u043e\u043d\u043e\u043a UseCols::sort(table1, COLUMNS(field1)); UseCols::sort(table1, COLUMNS(field1, field2)); \/\/ \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c auto itr1 = UseCols::findSorted(table1, COLUMNS(field1, field2), 1, 2); auto itr2 = UseCols::findFirst(table1, COLUMNS(field2), 1); \/\/ \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b auto [sumQty, sumSum] = UseCols::sum(table1, COLUMNS(qty, sum)); \/\/ \u0445\u043e\u0442\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e, \u0438 \u043f\u043e KISS'\u0443 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0448\u0442\u0443\u0447\u043d\u043e double sumQty2 = UseCols::sum(table1, FIELD(qty));<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0442\u0430\u043a\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u0440\u043e \u044d\u0442\u0438, \u043f\u0440\u043e \u0435\u0449\u0435 \u043a\u0443\u0447\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0421++, \u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043f\u0438\u0448\u0443. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols<\/a><\/p>\n<p>\u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0430 \u043f\u043e\u043a\u0430 \u043e\u0431\u0437\u043e\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <strong>COLUMNS<\/strong> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<h2>\u041f\u0440\u043e COLUMNS \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043f\u0438\u0441\u043a\u0430<\/h2>\n<p>UPD: \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0431\u044b\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f <strong>UC_COLUMNS<\/strong> &amp;&amp; <strong>UC_FIELD<\/strong>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0440\u0435\u0436\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>UPD: \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0435 <a class=\"mention\" href=\"\/users\/kanutah\">@KanuTaH<\/a> \u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043b\u044f\u043c\u0431\u0434\u044b \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 \u0431\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432: <strong>membersAccessor<\/strong>. \u0418 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043b\u044f\u043c\u0431\u0434\u044b.<\/p>\n<p><strong>COLUMNS<\/strong> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043b\u044f\u043c\u0431\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432 <strong>COLUMNS<\/strong> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0432\u044b\u0437\u043e\u0432\u0443 <strong>FIELD(field1)<\/strong>.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<p>\u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430: <strong>std::tuple&lt;const T1&amp;, const T2&amp;,&#8230;><\/strong><\/p>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043d\u043e \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b &#8212; \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <strong>std::sort<\/strong> &amp; <strong>std::lower_bound<\/strong>.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a (\u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a):<\/p>\n<pre><code class=\"cpp\">\/\/ COLUMNS(field1) [](const auto&amp; item) -> const auto&amp; {     return item.field1; };<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440:<\/p>\n<pre><code class=\"cpp\">struct Row2 {     int val1 = 0; }; struct Row1 {     Row2* field1 = nullptr;     int field2 = 0; }; std::vector&lt;const Row1*> list; ... auto &amp;[v1,v2] = COLUMNS(field1->val1, field2)(list.front());<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043b\u044f\u043c\u0431\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c <strong>membersAccessor<\/strong>, \u0432\u043c\u0435\u0441\u0442\u043e <strong>COLUMNS<\/strong>, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c <strong>COLUMNS<\/strong>. \u0415\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u0435\u0439 &#8212; \u0432 \u043d\u0435\u043c \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443. \u0418 \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0443\u0442\u044c \u043f\u043e \u0434\u043b\u0438\u043d\u043d\u0435\u0439.<\/p>\n<p>\u041d\u043e \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u044b \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <strong>std::tuple<\/strong>. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">UseCols::sort(list, UseCols::membersAccessor(&amp;Row::field1, &amp;Row::field2));<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043b\u044f\u043c\u0431\u0434\u044b.<\/p>\n<p>\u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">[](const auto&amp; item) -> auto {     return calcSomeFunction(item.field1, item.field2); };<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441 <strong>tuple<\/strong>, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 gcc, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u043b\u044f <strong>tuple<\/strong>. \u0425\u043e\u0442\u044f clang \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u043d\u0438\u0445:<\/p>\n<pre><code class=\"cpp\">[](const auto&amp; item) -> auto {     return std::tuple(calc1(item), calc2(item)); };<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <strong>UseCols::sort<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <strong>std::sort<\/strong>, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">template &lt;class T, class F> void sort(T&amp; collection, const F&amp; getFields) {      auto compare =         [&amp;getFields](const auto&amp; r1, const auto&amp; r2) -> bool {             return getFields(r1) &lt; getFields(r2);     };      std::sort(collection.begin(), collection.end(), compare); }<\/code><\/pre>\n<p>\u0418 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0438 \u044d\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0440\u0430\u0442\u043a\u0430\u044f \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">UseCols::sort(table1, COLUMNS(field1));<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a \u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0432\u044b \u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0438\u0445 \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0427\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0441\u043d\u043e\u0432\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a <strong>COLUMNS<\/strong> \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e. \u0422\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c \u0438\u0434\u0443\u0442 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b <strong>FOREACH<\/strong> &amp;&amp; <strong>JOIN<\/strong> \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u044b.<\/h2>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u043a\u0430 \u043a\u0440\u043e\u043c\u0435 <strong>findSorted<\/strong> &amp;&amp; <strong>findFirst<\/strong>, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0431\u0435\u0437 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u044b. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u0434\u0430. <\/p>\n<pre><code class=\"cpp\">UseCols::sort(table1, &amp;Row::field1); UseCols::sort(table1, &amp;Row::field1, &amp;Row::field2);<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f <strong>membersAccessor<\/strong>: \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438\u043d\u0430\u0447\u0435 <strong>std::tuple<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u044d\u0442\u043e \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430 \u0431\u0430\u0437\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <strong>membersAccessor<\/strong>:<\/p>\n<pre><code class=\"cpp\">template &lt;class L, class R, class I, class ...M> void sort(L&amp; collection, R I::* member1, M... members) {     sort(collection, membersAccessor(member1, members...)); }<\/code><\/pre>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430<\/h2>\n<p>(\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols.h<\/a>)<\/p>\n<p>(\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols_impl.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols_impl.h<\/a>)<\/p>\n<p>\u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d <strong>UseCols<\/strong>. \u0412 \u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>getFields<\/strong> \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u043b\u044f\u043c\u0431\u0434\u0430 \u0438\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <strong>COLUMNS<\/strong> \u0438\u043b\u0438 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>membersAccessor<\/strong>.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043b\u044f\u043c\u0431\u0434\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \/\/  \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 getFields, \/\/  \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: membersAccessor(&amp;Row::field1, &amp;Row::field2) template&lt;typename... Ts> auto membersAccessor(Ts... members);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. template &lt;class T, class F> void sort(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0422\u0430\u043a \u0436\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u043d\u043e \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. template &lt;class T, class F> void sortDesc(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/\u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0438\u0437 getFields \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. template &lt;class T, class F> auto sum(const T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c. \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f std::pair&lt;auto,bool>, \/\/ \u0433\u0434\u0435 second bool \u0440\u0430\u0432\u0435\u043d \u043b\u043e\u0436\u044c, \u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f. \/\/ (\u0445\u043e\u0442\u044f \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u043e\u0434\u0435, \u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e auto, \u043d\u043e \u043e\u043d pair)  template &lt;class T, class F> std::pair&lt;auto,bool> maxValue(T&amp; collection, const F&amp; getFields);  template &lt;class T, class F> std::pair&lt;auto,bool> minValue(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \/\/ \u043d\u0435 \u043f\u0443\u0441\u0442\u0430\u044f, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c maxValue2\/minValue2, \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437 std::pair  template &lt;class T, class F> auto maxValue2(T&amp; collection, const F&amp; getFields);  template &lt;class T, class F> auto minValue2(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \/\/ \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u0430\u0443\u043d\u0434\u0443 \u043e\u0442 getFields. \/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 collection \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 end().  template &lt;class T, class F> auto maxItem(T&amp; collection, const F&amp; getFields);  template &lt;class T, class F> auto minItem(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \/\/ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \/\/ \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u044d\u0442\u0438\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e. template &lt;class T, class F, class ...V> auto findSorted(const T&amp; collection, const F&amp; getFields, const V&amp;... value);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c, \/\/ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0442\u0431\u043e\u0440\u0443. template &lt;class T, class F, class ...V> auto findFirst(const T&amp; collection, const F&amp; getFields, const V&amp;... value);<\/code><\/pre>\n<h2>\u041a\u043b\u0430\u0441\u0441\u044b Groups &amp;&amp; Range<\/h2>\n<p>(\u043a\u043b\u0430\u0441\u0441\u044b: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/ranges.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/ranges.h<\/a>)<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">\/\/ \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 UseCols::sort(table1, FIELD(field1));  \/\/ \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f \u0441\u0442\u0440\u043e\u043a \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e field1. \/\/ \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c COLUMNS \/\/ \u0441 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a. for (auto&amp; range1: UseCols::groups(table1, FIELD(field1))) {      \/\/ \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435     \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u0433\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0434\u0435\u0441\u044c     \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b     auto [suQty,suSum] = UseCols::sum(range1, COLUMNS(qty,sum));      std::cout     &lt;&lt; \"value of group's field: \" &lt;&lt; range1->field1     &lt;&lt; \", count rows: \" &lt;&lt; range1.size()     &lt;&lt; \", sum of qty &amp; sum: \" &lt;&lt; suQty &lt;&lt; \", \" &lt;&lt; suSum     &lt;&lt; std::endl;      \/\/ \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0433\u0440\u0443\u043f\u043f\u044b     for (const Row&amp; row: range1) {         std::cout &lt;&lt; \" == row: field2, qty, sum: \"         &lt;&lt; row.field2 &lt;&lt; \", \" &lt;&lt; row.qty &lt;&lt; \", \" &lt;&lt; row.sum &lt;&lt; std::endl;     }      \/\/ \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0435\u0449\u0435 \u043d\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c     UseCols::sort(range1, FIELD(field2));     for (auto&amp; range2: UseCols::groups(range1, FIELD(field2))) {         std::cout &lt;&lt; \" ==== group lev2: field2, sum(qty), sum(sum): \"         &lt;&lt; r2->field2         &lt;&lt; \", \" &lt;&lt; UseCols::sum(r2, FIELD(qty))         &lt;&lt; \", \" &lt;&lt; UseCols::sum(r2, FIELD(sum))         &lt;&lt; std::endl;     } }<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>Range<\/strong> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: <strong>m_begin<\/strong> &amp;&amp; <strong>m_end<\/strong>. \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434\u044b <strong>begin()<\/strong> &amp;&amp; <strong>end()<\/strong>. \u0422.\u0435. \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043a\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u0442\u0440\u043e\u043a \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>Groups<\/strong> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043a \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b <strong>Range<\/strong> \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0435 <strong>field1<\/strong>, \u0442\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c. \u0418 \u043a\u043b\u0430\u0441\u0441 <strong>Groups<\/strong> \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <strong>Groups<\/strong> \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>groups<\/strong>:<\/p>\n<pre><code class=\"cpp\">template &lt;class T, class F> auto groups(T&amp; list, const F&amp; getFields) {     using Itr = decltype(list.begin());     return Groups&lt;Itr,F>(list, getFields); }<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>Range<\/strong>: empty(), size(), first(), last(), begin(), end(). (\u0418\u0445 \u0441\u043c\u044b\u0441\u043b \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0439).<\/p>\n<p>\u0418 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 -> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <strong>first()<\/strong> &#8212; \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438, \u0442.\u043a. \u043e\u043d\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>Groups<\/strong>: begin(), end().<\/p>\n<p>\u0418 \u043c\u0435\u0442\u043e\u0434 <strong>countGroups()<\/strong>, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0433\u0440\u0443\u043f\u043f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0433\u0440\u0443\u043f\u043f\u044b.<\/p>\n<p>\u0422.\u0435. \u043a\u043b\u0430\u0441\u0441 <strong>Groups<\/strong> \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0440\u0435\u0434\u0440\u0430\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432, \u0442.\u043a. \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0439 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 &#8212; \u0431\u0443\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0439, \u0447\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u0442\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 <strong>std::map<\/strong>.<\/p>\n<h2>\u041c\u0430\u043a\u0440\u043e\u0441\u044b FOREACH &amp;&amp; JOIN<\/h2>\n<p>(\u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/macroTools.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/macroTools.h<\/a>, \u0438 \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/macroForeach.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/macroForeach.h<\/a>)<\/p>\n<p>\u042d\u0442\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438. \u041e\u043d\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043b\u0438\u0448\u044c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0445 \u0441\u0434\u0435\u043b\u0430\u043d \u043c\u0430\u043a\u0440\u043e\u0441 <strong>COLUMNS<\/strong>. \u0412 \u043e\u0431\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u043c\u0430\u043a\u0440\u043e\u0441 <strong>COLUMNS<\/strong>, \u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c <strong>FOREACH<\/strong> &amp;&amp; <strong>JOIN<\/strong>. \u041c\u043e\u0436\u0435\u0442 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043a\u0443\u0447\u043a\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0438 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0414\u0435\u043b\u0430\u043b \u044f \u0438\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u0438 \u0432 \u043d\u0438\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0447\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <strong>COLUMNS<\/strong>.<\/p>\n<p>\u0421\u0443\u0442\u044c \u044d\u0442\u0438\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u0447\u0442\u043e \u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <strong>FUNC<\/strong> \u0434\u0440\u0443\u0433\u043e\u0433\u043e define, \u0438 \u0432\u0430\u0440\u0438\u0430\u0434\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418 \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 <strong>FUNC<\/strong> \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u0434\u0438\u0447\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0415\u0449\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0441\u043c. \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432 BOOST, \u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0437\u0434\u0435\u0441\u044c \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u0438 \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u043e.<\/p>\n<pre><code class=\"cpp\">\/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0435 (\u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438). \/\/ \u0411\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u044b: FUNC(NAME1,PARAM) FUNC(NAME2,PARAM) ... #define FOREACH(FUNC, PARAM, ...) \/\/ \u041e\u0442\u043b\u0438\u0447\u0438\u0435 JOIN \u043e\u0442 FOREACH, \u0447\u0442\u043e \u043e\u043d \u043c\u0435\u0436\u0434\u0443 \/\/ \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c FUNC \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 SPL. \/\/ \u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443, \u0438 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \/\/ \u0411\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u044b: FUNC(NAME1,PARAM) SPL FUNC(NAME2,PARAM) ... #define JOIN(SPL, FUNC, PARAM, ...)<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \/\/ \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c: \/\/  int var1 = 5; int var2 = 5; int var3 = 5; #define USE1(NAME, PARAM) int NAME = PARAM; FOREACH(USE1, 5, var1, var2, var3)  \/\/ \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \/\/ \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438. \u0420\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c: \/\/ void myFunc(int par1 = 5, int par2 = 5, int par3 = 5); #define USE2(NAME, PARAM) int NAME = PARAM void myFunc(JOIN(COMMA, USE2, 5, par1, par2, par3));<\/code><\/pre>\n<p>\u041d\u0438\u0436\u0435 \u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u043f\u0440\u043e \u043d\u0435\u043a\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 MSVC. \u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043f\u043e\u0434 gcc, \u043f\u043e\u0437\u0436\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 clang \u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u043a\u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443. \u0418 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 MSVC, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u043a\u0438. \u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u044d\u0442\u043e\u043c\u0443: <a href=\"https:\/\/stackoverflow.com\/questions\/5134523\/msvc-doesnt-expand-va-args-correctly\" rel=\"noopener noreferrer nofollow\">https:\/\/stackoverflow.com\/questions\/5134523\/msvc-doesnt-expand-va-args-correctly<\/a><\/p>\n<pre><code class=\"cpp\">\/\/ \u044d\u0442\u043e \u0434\u0443\u043c\u0430\u044e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438 \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432... #define COMMA ,  \/\/ \u0427\u0442\u043e \u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u0435, \/\/ \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438. \/\/ \u0442.\u0435. \u0432\u044b\u0437\u043e\u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432 \u0441\u043a\u043e\u0431\u043a\u0438, \/\/ \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \/\/ \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441: SOMETHING(REPACK(pair&lt;int,int>)) \/\/ \u0418 \u0434\u0440\u0443\u0433\u043e\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \/\/ \u043e\u0431\u0445\u043e\u0434\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430 MSVC \u043f\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044e __VA_ARGS__ #define REPACK(...) __VA_ARGS__  \/\/ \u042d\u0442\u043e \u043f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u043a\u043e\u0431\u043a\u0438. \/\/ \u0412\u043e \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u0445, \/\/ \u0447\u0442\u043e \u0431\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435, \/\/ \u0438 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0437\u0430\u043b\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \/\/ \u0435\u0433\u043e \u043e\u0431\u0435\u0440\u043d\u0435\u043c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. \u0410 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0438\u0438 \/\/ \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c: UNWRAP #define FIXWRAP(...) (__VA_ARGS__)  \/\/ \u0422\u0430\u043a\u043e\u0439 \u0445\u0438\u0442\u0440\u043e\u0432\u0430\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u0431\u0440\u0430\u043d\u0430 \u043e\u0434\u043d\u0430 \u043f\u0430\u0440\u0430 \/\/ \u0441\u043a\u043e\u0431\u043e\u043a \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u0421\u0430\u043c\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 REPACK \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f MSVC. #define UNWRAP_HELPER(...) __VA_ARGS__ #define UNWRAP(X) REPACK(REPACK(UNWRAP_HELPER)X)  \/\/ \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u043e\u0432\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 #define CAT(A,B) A##B<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0447\u0443\u0442\u043e\u0447\u043a\u0443 \u0441\u043b\u043e\u0436\u043d\u0435\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u0430\u0440\u0438\u0430\u0434\u0438\u0447\u043d\u043e\u0433\u043e define. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">#define CNT_ARGS_HELPER_2( \\     _1,_2,_3,_4,_5,_6,_7,_8,_9,_10, \\     _11,_12,_13,_14,_15,_16,_17,_18,_19, n, ...) n  \/\/ \u0414\u043b\u044f MSVC \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e. #define CNT_ARGS_HELPER_1(...) REPACK(CNT_ARGS_HELPER_2(__VA_ARGS__))  \/\/ \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. #define CNT_ARGS(...) \\     CNT_ARGS_HELPER_1(__VA_ARGS__, \\     19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)  \/\/ \u042d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0434\u0438\u043d, \u0438\u043b\u0438 \u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e. \/\/ \u0418\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 1, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0438\u043d\u0430\u0447\u0435 0. #define ONLY_ONE_ARG(...) \\     CNT_ARGS_HELPER_1(__VA_ARGS__, \\     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u043d\u043e\u0432\u0430 \u0434\u043b\u044f <strong>FOREACH<\/strong> &amp;&amp; <strong>JOIN<\/strong>:<\/p>\n<pre><code class=\"cpp\">\/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 SEQ_&lt;NUM> \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \/\/ \u0438\u043c\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 __VA_ARGS__. \/\/ \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 APPLY. \/\/ \u0418 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0436\u0434\u044b\u043c APPLY \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 SPL, \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0430 FIXWRAP, \/\/ \u0430 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 UNWRAP. \/\/ \u0412 \u043d\u0438\u0445 REPACK \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u043b\u044e\u043a\u0430 MSVC.  #define SEQ_1(SPL, FN, P0, NAME, ...) APPLY(FN, NAME, P0) #define SEQ_2(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_1(SPL, FN, P0, __VA_ARGS__)) #define SEQ_3(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_2(SPL, FN, P0, __VA_ARGS__)) #define SEQ_4(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_3(SPL, FN, P0, __VA_ARGS__)) #define SEQ_5(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_4(SPL, FN, P0, __VA_ARGS__)) #define SEQ_6(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_5(SPL, FN, P0, __VA_ARGS__)) #define SEQ_7(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_6(SPL, FN, P0, __VA_ARGS__)) #define SEQ_8(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_7(SPL, FN, P0, __VA_ARGS__)) #define SEQ_9(SPL, FN, P0, NAME, ...) \\     APPLY_SPL(FN, NAME, P0, SPL) REPACK(SEQ_8(SPL, FN, P0, __VA_ARGS__))  \/\/ \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d #define SEQ_NUM(N, SPL, FN, P0, ...) \\     REPACK(CAT(SEQ_,N)(SPL, FN, P0, __VA_ARGS__))  \/\/ \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0434\u0435\u0444\u0430\u0439\u043d \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0444\u0430\u0439\u043d\u0430. #define APPLY_SPL(FN, NAME, P0, SPL) APPLY(FN, NAME, P0) UNWRAP(SPL) #define APPLY(FN, NAME, P0) FN(NAME, UNWRAP(P0))  \/\/ \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0435\u0444\u0430\u0439\u043d \u0434\u043b\u044f FOREACH &amp;&amp; JOIN #define SEQ_HELPER(SPL, FN, P0, ...) \\     SEQ_NUM(CNT_ARGS(__VA_ARGS__), SPL, FN, P0, __VA_ARGS__)<\/code><\/pre>\n<p>\u0418 \u0441\u0430\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f <strong>FOREACH<\/strong> &amp;&amp; <strong>JOIN<\/strong>:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u044b: FN(NAME1, P0) SPL FN(NAME2, P0) ... #define JOIN(SPL, FN, P0, ...) \\     SEQ_HELPER(FIXWRAP(SPL), FN, FIXWRAP(P0), __VA_ARGS__) \/\/ \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u044b: FN(NAME1, P0) FN(NAME2, P0) ... #define FOREACH(FN, P0, ...)   \\     SEQ_HELPER(FIXWRAP(), FN, FIXWRAP(P0), __VA_ARGS__)<\/code><\/pre>\n<h2>\u0421\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0441\u044c \u043a \u043c\u0430\u043a\u0440\u043e\u0441\u0443 COLUMNS<\/h2>\n<p>(\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/macroColumns.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/macroColumns.h<\/a>)<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 &#8212; <strong>FIELD<\/strong>:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \/\/ \u0432 \u0441\u0441\u044b\u043b\u043a\u0443, \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. template &lt;class T> const T&amp; asReference(const T* p) { return *p; }  template &lt;class T> const T&amp; asReference(T* p) { return *p; }  template &lt;class T> const T&amp; asReference(const T&amp; p) { return p; }  template &lt;class T> const T&amp; asReference(T&amp; p) { return p; }  #define FIELD(X) [](const auto&amp; it) -> const auto&amp; { \\     return asReference(it).X; }<\/code><\/pre>\n<p>\u0418 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a:<\/p>\n<pre><code class=\"cpp\">\/\/ COLS_HELPER_1 - \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 #define COLS_HELPER_1(X) FIELD(X)  \/\/ COLS_HELPER_0 - \u0433\u0440\u0443\u043f\u043f\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a #define COLS_HELPER_0__FIELD(X,DUMMY) asReference(it).X  #define COLS_HELPER_0__DECLTYPE_REMOVE_CVREF(X) \\     typename std::remove_cv&lt; \\     typename std::remove_reference&lt; \\         decltype(asReference(it).X)>::type>::type  #define COLS_HELPER_0__DECLTYPE_WITH_REFERENCE(X,DUMMY) \\     const COLS_HELPER_0__DECLTYPE_REMOVE_CVREF(X)&amp;  \/\/ \u0437\u0434\u0435\u0441\u044c ~ \u044d\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u043b\u044e\u043a\u0430 MSVC. \u041f\u043e\u0437\u0436\u0435 \u044d\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 DUMMY. #define COLS_HELPER_0__TYPE_WITH_REFERENCE(...) \\     std::tuple&lt;JOIN(COMMA, \\         COLS_HELPER_0__DECLTYPE_WITH_REFERENCE, ~, __VA_ARGS__)>  #define COLS_HELPER_0(...) \\     [](const auto&amp; it) -> \\         COLS_HELPER_0__TYPE_WITH_REFERENCE(__VA_ARGS__) { \\             return COLS_HELPER_0__TYPE_WITH_REFERENCE(__VA_ARGS__)( \\                 JOIN(COMMA, COLS_HELPER_0__FIELD, ~, __VA_ARGS__) \\         ); \\     }  \/\/ \u0432\u044b\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u043e\u0434\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430 - \u0431\u0435\u0437 tuple, \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e #define COLS_HELPER_BOOL(ONLY_ONE, ...) \\         CAT(COLS_HELPER_,ONLY_ONE)(__VA_ARGS__)  #define COLUMNS(...) COLS_HELPER_BOOL( \\         ONLY_ONE_ARG(__VA_ARGS__), __VA_ARGS__)<\/code><\/pre>\n<h2>\u041d\u0443 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0435<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u043f\u043e \u043d\u0430\u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0444\u0438\u043d\u0442\u043e\u0432 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0431\u043e\u0440\u044b, \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0438\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446. \u041d\u043e \u043c\u043d\u0435 \u043f\u043e\u043a\u0430 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0434\u0430\u0436\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <strong>COLUMNS<\/strong> \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <strong>FIELD<\/strong>.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u043a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols<\/a><\/p>\n<p>\u0418 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/main.cpp\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/main.cpp<\/a><\/p>\n<p>UPD: \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043b\u0438\u0431\u044b \u0443\u0436\u0435 \u0447\u0443\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c, \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041e\u0441\u043e\u0431\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0431\u044b\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442 <a class=\"mention\" href=\"\/users\/kanutah\">@KanuTaH<\/a>. <\/p>\n<\/div>\n<\/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\/post\/584392\/\"> https:\/\/habr.com\/ru\/post\/584392\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043a \u043e\u0431\u043e\u0437\u0440\u0435\u043d\u0438\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">struct Row {     int field1 = 0;     int field2 = 0;     double qty = 0;     double sum = 0; };  std::vector&lt;Row> table1; ... \/\/ \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0447\u043d\u044e \u043a\u043e\u043b\u043e\u043d\u043e\u043a UseCols::sort(table1, COLUMNS(field1)); UseCols::sort(table1, COLUMNS(field1, field2)); \/\/ \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c auto itr1 = UseCols::findSorted(table1, COLUMNS(field1, field2), 1, 2); auto itr2 = UseCols::findFirst(table1, COLUMNS(field2), 1); \/\/ \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b auto [sumQty, sumSum] = UseCols::sum(table1, COLUMNS(qty, sum)); \/\/ \u0445\u043e\u0442\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e, \u0438 \u043f\u043e KISS'\u0443 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0448\u0442\u0443\u0447\u043d\u043e double sumQty2 = UseCols::sum(table1, FIELD(qty));<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0442\u0430\u043a\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u0440\u043e \u044d\u0442\u0438, \u043f\u0440\u043e \u0435\u0449\u0435 \u043a\u0443\u0447\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0421++, \u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043f\u0438\u0448\u0443. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols<\/a><\/p>\n<p>\u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0430 \u043f\u043e\u043a\u0430 \u043e\u0431\u0437\u043e\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <strong>COLUMNS<\/strong> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<h2>\u041f\u0440\u043e COLUMNS \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043f\u0438\u0441\u043a\u0430<\/h2>\n<p>UPD: \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0431\u044b\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f <strong>UC_COLUMNS<\/strong> &amp;&amp; <strong>UC_FIELD<\/strong>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0440\u0435\u0436\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>UPD: \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0435 <a class=\"mention\" href=\"\/users\/kanutah\">@KanuTaH<\/a> \u0411\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043b\u044f\u043c\u0431\u0434\u044b \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 \u0431\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432: <strong>membersAccessor<\/strong>. \u0418 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043b\u044f\u043c\u0431\u0434\u044b.<\/p>\n<p><strong>COLUMNS<\/strong> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043b\u044f\u043c\u0431\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432 <strong>COLUMNS<\/strong> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0432\u044b\u0437\u043e\u0432\u0443 <strong>FIELD(field1)<\/strong>.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<p>\u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430: <strong>std::tuple&lt;const T1&amp;, const T2&amp;,&#8230;><\/strong><\/p>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043d\u043e \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b &#8212; \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <strong>std::sort<\/strong> &amp; <strong>std::lower_bound<\/strong>.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a (\u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a):<\/p>\n<pre><code class=\"cpp\">\/\/ COLUMNS(field1) [](const auto&amp; item) -> const auto&amp; {     return item.field1; };<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440:<\/p>\n<pre><code class=\"cpp\">struct Row2 {     int val1 = 0; }; struct Row1 {     Row2* field1 = nullptr;     int field2 = 0; }; std::vector&lt;const Row1*> list; ... auto &amp;[v1,v2] = COLUMNS(field1->val1, field2)(list.front());<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043b\u044f\u043c\u0431\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c <strong>membersAccessor<\/strong>, \u0432\u043c\u0435\u0441\u0442\u043e <strong>COLUMNS<\/strong>, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c <strong>COLUMNS<\/strong>. \u0415\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u0435\u0439 &#8212; \u0432 \u043d\u0435\u043c \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443. \u0418 \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0443\u0442\u044c \u043f\u043e \u0434\u043b\u0438\u043d\u043d\u0435\u0439.<\/p>\n<p>\u041d\u043e \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u044b \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <strong>std::tuple<\/strong>. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">UseCols::sort(list, UseCols::membersAccessor(&amp;Row::field1, &amp;Row::field2));<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043b\u044f\u043c\u0431\u0434\u044b.<\/p>\n<p>\u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">[](const auto&amp; item) -> auto {     return calcSomeFunction(item.field1, item.field2); };<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441 <strong>tuple<\/strong>, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 gcc, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u043b\u044f <strong>tuple<\/strong>. \u0425\u043e\u0442\u044f clang \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u043d\u0438\u0445:<\/p>\n<pre><code class=\"cpp\">[](const auto&amp; item) -> auto {     return std::tuple(calc1(item), calc2(item)); };<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <strong>UseCols::sort<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <strong>std::sort<\/strong>, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">template &lt;class T, class F> void sort(T&amp; collection, const F&amp; getFields) {      auto compare =         [&amp;getFields](const auto&amp; r1, const auto&amp; r2) -> bool {             return getFields(r1) &lt; getFields(r2);     };      std::sort(collection.begin(), collection.end(), compare); }<\/code><\/pre>\n<p>\u0418 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0438 \u044d\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0440\u0430\u0442\u043a\u0430\u044f \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">UseCols::sort(table1, COLUMNS(field1));<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a \u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0432\u044b \u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0438\u0445 \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0427\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0441\u043d\u043e\u0432\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a <strong>COLUMNS<\/strong> \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e. \u0422\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c \u0438\u0434\u0443\u0442 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b <strong>FOREACH<\/strong> &amp;&amp; <strong>JOIN<\/strong> \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u044b.<\/h2>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u043a\u0430 \u043a\u0440\u043e\u043c\u0435 <strong>findSorted<\/strong> &amp;&amp; <strong>findFirst<\/strong>, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0431\u0435\u0437 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434\u044b. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u0434\u0430. <\/p>\n<pre><code class=\"cpp\">UseCols::sort(table1, &amp;Row::field1); UseCols::sort(table1, &amp;Row::field1, &amp;Row::field2);<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f <strong>membersAccessor<\/strong>: \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438\u043d\u0430\u0447\u0435 <strong>std::tuple<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u044d\u0442\u043e \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430 \u0431\u0430\u0437\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <strong>membersAccessor<\/strong>:<\/p>\n<pre><code class=\"cpp\">template &lt;class L, class R, class I, class ...M> void sort(L&amp; collection, R I::* member1, M... members) {     sort(collection, membersAccessor(member1, members...)); }<\/code><\/pre>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430<\/h2>\n<p>(\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols.h<\/a>)<\/p>\n<p>(\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols_impl.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/useCols_impl.h<\/a>)<\/p>\n<p>\u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d <strong>UseCols<\/strong>. \u0412 \u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>getFields<\/strong> \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u043b\u044f\u043c\u0431\u0434\u0430 \u0438\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <strong>COLUMNS<\/strong> \u0438\u043b\u0438 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>membersAccessor<\/strong>.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043b\u044f\u043c\u0431\u0434\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u043b\u044f\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \/\/  \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 getFields, \/\/  \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: membersAccessor(&amp;Row::field1, &amp;Row::field2) template&lt;typename... Ts> auto membersAccessor(Ts... members);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. template &lt;class T, class F> void sort(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0422\u0430\u043a \u0436\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u043d\u043e \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. template &lt;class T, class F> void sortDesc(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/\u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0438\u0437 getFields \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. template &lt;class T, class F> auto sum(const T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c. \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f std::pair&lt;auto,bool>, \/\/ \u0433\u0434\u0435 second bool \u0440\u0430\u0432\u0435\u043d \u043b\u043e\u0436\u044c, \u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f. \/\/ (\u0445\u043e\u0442\u044f \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u043e\u0434\u0435, \u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e auto, \u043d\u043e \u043e\u043d pair)  template &lt;class T, class F> std::pair&lt;auto,bool> maxValue(T&amp; collection, const F&amp; getFields);  template &lt;class T, class F> std::pair&lt;auto,bool> minValue(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \/\/ \u043d\u0435 \u043f\u0443\u0441\u0442\u0430\u044f, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c maxValue2\/minValue2, \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437 std::pair  template &lt;class T, class F> auto maxValue2(T&amp; collection, const F&amp; getFields);  template &lt;class T, class F> auto minValue2(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \/\/ \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u0430\u0443\u043d\u0434\u0443 \u043e\u0442 getFields. \/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 collection \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 end().  template &lt;class T, class F> auto maxItem(T&amp; collection, const F&amp; getFields);  template &lt;class T, class F> auto minItem(T&amp; collection, const F&amp; getFields);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \/\/ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \/\/ \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u044d\u0442\u0438\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e. template &lt;class T, class F, class ...V> auto findSorted(const T&amp; collection, const F&amp; getFields, const V&amp;... value);<\/code><\/pre>\n<pre><code class=\"cpp\">\/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c, \/\/ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0442\u0431\u043e\u0440\u0443. template &lt;class T, class F, class ...V> auto findFirst(const T&amp; collection, const F&amp; getFields, const V&amp;... value);<\/code><\/pre>\n<h2>\u041a\u043b\u0430\u0441\u0441\u044b Groups &amp;&amp; Range<\/h2>\n<p>(\u043a\u043b\u0430\u0441\u0441\u044b: <a href=\"https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/ranges.h\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/victorprogrammist\/useCols\/blob\/main\/useCols\/ranges.h<\/a>)<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">\/\/ \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 UseCols::sort(table1, FIELD(field1));  \/\/ \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f \u0441\u0442\u0440\u043e\u043a \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e field1. \/\/ \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c COLUMNS \/\/ \u0441 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a. for (auto&amp; range1: UseCols::groups(table1, FIELD(field1))) {      \/\/ \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435     \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u0433\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0434\u0435\u0441\u044c     \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b     auto [suQty,suSum] = UseCols::sum(range1, COLUMNS(qty,sum));      std::cout     &lt;&lt; \"value of group's field: \" &lt;&lt; range1->field1     &lt;&lt; \", count rows: \" &lt;&lt; range1.size()     &lt;&lt; \", sum of qty &amp; sum: \" &lt;&lt; suQty &lt;&lt; \", \" &lt;&lt; suSum     &lt;&lt; std::endl;      \/\/ \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0433\u0440\u0443\u043f\u043f\u044b     for (const Row&amp; row: range1) {         std::cout &lt;&lt; \" == row: field2, qty, sum: \"         &lt;&lt; row.field2 &lt;&lt; \", \" &lt;&lt; row.qty &lt;&lt; \", \" &lt;&lt; row.sum &lt;&lt; std::endl;     }      \/\/ \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0435\u0449\u0435 \u043d\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c     UseCols::sort(range1, FIELD(field2));     for (auto&amp; range2: UseCols::groups(range1, FIELD(field2))) {         std::cout &lt;&lt; \" ==== group lev2: field2, sum(qty), sum(sum): \"         &lt;&lt; r2->field2         &lt;&lt; \", \" &lt;&lt; UseCols::sum(r2, FIELD(qty))         &lt;&lt; \", \" &lt;&lt; UseCols::sum(r2, FIELD(sum))         &lt;&lt; std::endl;     } }<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>Range<\/strong> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: <strong>m_begin<\/strong> &amp;&amp; <strong>m_end<\/strong>. \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434\u044b <strong>begin()<\/strong> &amp;&amp; <strong>end()<\/strong>. \u0422.\u0435. \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043a\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u0442\u0440\u043e\u043a \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>Groups<\/strong> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043a \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b <strong>Range<\/strong> \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0435 <strong>field1<\/strong>, \u0442\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c. \u0418 \u043a\u043b\u0430\u0441\u0441 <strong>Groups<\/strong> \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <strong>Groups<\/strong> \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>g<\/strong><\/p>\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-327320","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/327320","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=327320"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/327320\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=327320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=327320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=327320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}