áá á¬ážá á áá»ááºážááŸá¬ áá¶áá¶ááŸá¬ C++ áá¯ááºááœá± áá»áááºááœá²áá¬ážááá¯á·ááŸáááẠá¡áá¯á¶ážááŸá¬ áááºážááᯠááŒá±áá±á¬ááºáá²á· áá áºáááºáá áºááááá·áºáááºá
Bjarne Stroustrup
á¡á±á¬ááºááá¯áá¬á 31 áááºáá±á·á០ááá¯áááºáá¬á 1 áááºáá±á·á¡áá JUG Ru Group á០á
á®á
ááºáá»ááºážááá±á¬ áá¯ááŸá¬ážááá¯ááºáá¶ááŸá á¡ááŒá®ážá
á¬áž áááá¯ááááºážáááºážááœááºáááá·áºáá»á¬ážáá²á០áá
áºáá¯ááŒá
áºáá±á¬ C++ Russia Piter áá®áá¬áá¶ááᯠá
ááá·áºáá®áá¬á
áááºááŒáá¯á·ááœáẠáá»ááºážááá²á·áá«áááºá á§áá·áºá
áá®áá¬áá»á¬ážááœáẠC++ á
á¶áá»áááºá
á¶ááœáŸááºážáá±á¬áºááá®á¡ááœá²á·áááºáá»á¬ážá CppCon á
áá®áá¬áá»á¬ážá O'Reilly á
á¬á¡á¯ááºá
á¬áá±ážááá¬áá»á¬ážááŸáá·áº LLVMá libc++ ááŸáá·áº Boost áá²á·ááá¯á·áá±á¬ ááá±á¬áá»ááºáá»á¬ážááᯠááááºážááááºážáá°áá»á¬ážáá«áááºáááºá ááœá±ážááœá±ážááœá²ááẠáááºážááá¯á·á áá»áœááºážáá»ááºááŸá¯ááᯠáááºááŸáá¯ááºážá
á±áᬠááá¯ááºááá¯ááºáááºááœááºááŸá¯ááœáẠá¡ááœá±á·á¡ááŒá¯á¶áá»á¬áž áááŸááºááá¯áá±á¬ á¡ááœá±á·á¡ááŒá¯á¶ááŸááá±á¬ C++ developer áá»á¬ážá¡ááœáẠáááºááœááºáá«áááºá áá»á±á¬ááºážáá¬ážáá»á¬ážá ááœá²á·ááœááºáá»á±á¬ááºážáá¬ážáá»á¬ážááŸáá·áº ááá¹áááá¯ááºááá¬ááá¬ááá»á¬ážááᯠá¡ááœááºáá±á¬ááºážááœááºáá±á¬ áá»áŸá±á¬á·á
á»á±ážáá»á¬ážááŒáá·áº áá¶á·ááá¯ážáá±ážáá«áááºá
áá±á¬áºá ááá¯áá®áá¬áá¶ááá¯ááºáá±ááŸá¯ááᯠáá¬ááá·áºááŸá áºá§ááŒá®áááœáẠá¡á á±á¬áá¯á¶ážáá¬áá±á¬ááºáááºáááºááá¯ááºáááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áº áá áºáá»áááºáááºážááœáẠáá»áœááºá¯ááºááá¯á·ááá»á±á¬ááºážáá¬ážáá»á¬ážááẠáá±á¬ááºáá¯á¶ážááœá²á áááºážááá¯á·áááºáá°áá²á·áá±á¬ á áááºáááºá á¬ážááœááºá¡áá¬áá»á¬ážááᯠááŒá±á¬ááŒáá«áááºá
áá¬ááºáá¯á¶ ááŸ
ááŒáŸáá»á¯áá»ááá¯á·á¡ááœá±á¬áá»áž
National Research University Higher School of Economics - á ááá·áºáá®áá¬á áááºá០áá»á±á¬ááºážáá¬ážááŸá áºáŠážááẠá€ááá¯á·á áºááœáẠá¡áá¯ááºáá¯ááºáá²á·áááº-
- Liza Vasilenko ááẠApplied Mathematics and Computer Science áááá¯ááááºá áá áºá áááºáá áºááá¯ááºážá¡ááŒá ẠProgramming Languages ââááᯠáá±á·áá¬áá±áá±á¬ 4th ááŸá Ạááœá²á·ááŒáá¯áá»á±á¬ááºážáá¬ážááŒá áºáááºá ááá¹áááá¯ááºáááááŸá áºááœáẠC++ áá¬áá¬á áá¬ážááŸáá·áº áááºážááŸá®ážáá¬ááŒá®áž áá±á¬ááºááá¯ááºážááœáẠáá¯ááºáááºážááœááºááœáẠá¡áá¯ááºáááºáá»á¬ážááŸáá áºááá·áº áááºážááŸáá·áº ááœá²áááºáá¯ááºááá¯ááºááá·áº á¡ááœá±á·á¡ááŒá¯á¶ááᯠáááŸááá²á·áááºá áá±áá¯áá»á¡á¬ážááŒáá·áº áááá¯ááááºážáááºážáá¬áá¬á áá¬ážáá»á¬ážá¡ááœáẠáá»áœááºá¯ááºáá áááºá¡á¬ážáááºáááºááŸá¯ááẠá¡áá°ážáááŒáá·áº áá®áá¬áá¶ááœáẠá¡á á®áááºáá¶á á¬áá»á¬ážááœá±ážáá»ááºááŒááºážá¡áá±á«áº áááºážáá¡ááŸááºá¡áá¬ážá¡ááŒá Ạáá»ááºáá áºáá²á·áááºá
- Danya Smirnov ááẠMaster's Program "Programming and Data Analysis" á 1st year áá»á±á¬ááºážáá¬ážááŒá áºáááºá áá»á±á¬ááºážááŸá¬áá±áá¯ááºážá C++ ááŸá¬ Olympiad ááŒá¿áá¬ááœá±ááᯠáá±ážáá²á·ááŒá®ážáá±á¬á· áá¬áá¬á áá¬ážáᬠááá¬áá±ážááá¯ááºáᬠááŸá¯ááºááŸá¬ážááŸá¯ááœá±ááŸá¬ á¡áááºáááŒáẠáá±á«áºáá¬ááŒá®áž áá±á¬ááºáá¯á¶ážááŸá¬ á¡ááá á¡áá¯ááºáá¯ááºáá²á· áá¬áá¬á áá¬áž ááŒá áºáá¬áá²á·áá«áááºá áá»áœááºá¯ááºááẠáá»áœááºá¯ááºáá¡ááááá¬ááá¯ážáááºáááºááŸáá·áº á¡ááœáá·áºá¡áááºážáá áºáá»á¬ážá¡ááŒá±á¬ááºáž áá±á·áá¬ááẠáá®áá¬áá¶ááœáẠáá«áááºááẠáá¯á¶ážááŒááºáá²á·áááºá
ááááºážááœáŸá¬ááœááºá áá¬áááá¯ááºáá¬áá±á«ááºážáá±á¬ááºáá»á¬ážááẠáá»áœááºá¯ááºááá¯á·áá¡áá°ážááŒá¯ááŸáá·áºáááºáááºááá·áº ááá¬áá±ážááá¯ááºáá¬ááœá²áá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááᯠáááŒá¬áá áá»áŸáá±áá«áááºá á ááºáááºáá¬áááœáẠáá»áœááºá¯ááºááá¯á·ááẠC++ Russia ááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºáá»á¬ážááᯠááœá±á·áá²á·ááŒá®áž áá¬ážáá±á¬ááºáá°áá»á¬ážá¡ááŒá Ạá á¬áááºážááœááºážááẠáá¯á¶ážááŒááºáá²á·áááºá á€áá²á·ááá¯á· áá®áá¬áá¶áá»á¬ážááœáẠáá«áááºááŒááºážá ááááá¯á¶áž á¡ááœá±á·á¡ááŒá¯á¶ááŒá áºáááºá
áá®áá¬áá¶ááœá²á·á ááºážáá¯á¶
-
á¡á á®áááºáá¶á á¬áá»á¬áž
ááŸá áºáááºáá¬áá¬áá¡ááœááºážá áá»áœááºážáá»ááºáá°áá»á¬ážááẠá¡á á®áááºáá¶á ᬠ30 ááá¯áááºááŒá¬ážáá²á·ááŒá®ážá áá»á¬ážá áœá¬áá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážáá«áááºáááº- á¡áá¯á¶ážáá»ááŒá¿áá¬áá»á¬ážááá¯ááŒá±ááŸááºážááẠáá¬áá¬á áá¬ážá¡ááºá¹áá«áááºáá»á¬ážááᯠáááºááŒááºáá±á¬á¡áá¯á¶ážááŒá¯ááŸá¯áá»á¬ážá á á¶á¡áá áºááŸáá·áºáááºá ááºá áá¬ááá·áºáá¬áá¬á áá¬ážááœááºážáá¶ááŸá¯áá»á¬ážá C++ áá®ááá¯ááºážááœáẠá¡áá±ážá¡áá°áá»á¬ážááŸáá·áº áááºážááá¯á·áá¡áá»áá¯ážáááºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááá·áºá¡áá« ááŒáá¯áááºáá¬ááœááºááŸá¯áá»á¬ážá á¥ááá¬áá»á¬ážá á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá±á¬ ááá±á¬áá»ááºáááá¯áá¬áááºáá¬áá»á¬ážááŸáá·áº áá¬áá¬á áá¬ážá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááá¯ááºáᬠá¡áá±ážá áááºá¡áá»ááºá¡áááºá¡áá»áá¯á·á áá»á±á¬áºááŒá±ááœá² áá¯á¶ážáá¯ááᯠáá áºááŒáá¯ááºááẠááŒá¯áá¯ááºáá²á·ááŒá®áž á¡áá»á¬ážá á¯ááŸá¬ áá¯ááŸá¬ážáá¬áá¬ááŒáá·áº ááŸá áºáá¯ááŸáá·áº á¡ááºá¹áááááºáá¬áá¬ááŒáá·áº áá áºááŒááẠááŒá¯áá¯ááºáá±á·ááŸááááºá
-
ááœá±ážááœá±ážáááºáá±áá¬áá»á¬áž
áááá·áºááœááºážá¡ááŒá®ážááœáẠááá±ážááá±ážáá±á¬ áá±ážááœááºážáá»á¬ážááŸáá·áº áááŒá®ážáá¯á¶ážáá±ážáá±á¬ ááœá±ážááœá±ážááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠá¡ááŸááºá¡áá¬ážáá¯ááºáá»á¬ážáááºáááºáá¬ážáá±á¬ á áá®áá¬áá»á¬ážááŸáá·áº áááºááœááºáááºá¡ááœáẠá¡áá°ážáááºááŸááºáá¬ážáá±á¬áá±áá¬áá»á¬ážááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážáá²á·áá«áááºá á¡ááŒá±á¬á¡ááá¯ááœá±ááŒá¬ážá á¡áá¬ážáá°áááºáž áá¬áá¬áá»á±á¬áºááœáŸááºááœáẠá áá¬ážá ááŒááºááŒá±á¬ááá¯á· áááºážáááºážáá±á¬ááºážá
-
Lightning Talks ááŸáá·áº á¡ááœááºááá±á¬ ááœá±ážááœá±ážááŸá¯áá»á¬áž
á¡á á®áááºáá¶á á¬ááá¯áá áºáᯠáá±ážááá¯áá«áá ááá±áááºáž Lightning Talk á¡ááœáẠwhiteboard ááœáẠá á¬áááºážááœááºážááá¯ááºááŒá®áž ááœááºáááá·áº áá±á«ááºážá ááºááŸáá·áº áááºáááºááá·áº á¡ááŒá±á¬ááºážá¡áá¬ááŸááºááá»áŸááᯠááœá±ážááœá±ážááẠá¡áá»áááºáá«ážáááá Ạááá°ááá¯ááºáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá C++ á¡ááœáẠááá·áºá ááºáá±ážáá»á¬ážááᯠá¡ááŒááºááááºáááºááŒááºáž (á¡áá»áá¯á·á¡ááœáẠá¡áá áºááŒá áºáááº) ááá¯á·ááá¯áẠááŒá¬ážáá¬ááŒá¬ážááá±á¬áºáááºáž áááŒááºááá¯ááºáá±á¬ sine wave áá»áá¯ážáááºááœáẠbug áá áºáá¯á¡ááŒá±á¬ááºáž áá¬ááºáááºážáá áºáá¯ááºá
á¡ááŒá¬ážáá¯á¶á á¶ááŸá¬ âááŸáá¯á¶ážáá¬ážááŸááŸáá¯á¶ážááœááºážáá±á¬áºááá®â ááŸáá·áº ááœá±ážááœá±ážááŸá¯ááŒá áºáááºá á ááºááŒáá·áºáá±á«áºááœáẠá á¶áááºááŸááºáá±ážáá±á¬áºááá®á á¡ááœá²á·áááºá¡áá»áá¯á·ááŸááá«áááºá áááá¯áá»ááºáá¬ááœáẠáá®ážááá¯áá áºáá¯ááŸáááẠ(ááá¬ážááẠ- á áááºáááºážááŸááºááŒáá·áº áá±áá¯ááá¯áááºáá®ážáááºá ááá¯á·áá±á¬áº á¡ááŒá±á¬ááºážá¡áááºážááŸá¬ "á¡áá¬áá¬ááá¯ááºážááẠáá®ážáá»ááºáá±áá±á¬ááŒá±á¬áá·áº" áááºá áá¬áá±á¬ááºážáá¯á¶áá±á«áºáááº)á á á¶ááŸáá·áº C++ á áá±áá°áá»á¡ááŒááºááŸáá·áºáááºáááºáá±á¬ áá±ážááœááºážáá»á¬ážá áááºážááá¬ááá¯ááºáᬠááœá±ážááœá±ážááŸá¯áá»á¬ážááŸáá·áº á á áºááœá²áá»á¬áž áááŸááá²á áá±á¬áºááá®ááœáẠáá áºá á¯á¶áá áºáá¬ááᯠáá¯á¶ážááá±áá»á¬áááááá¯áẠááá¯á·ááá¯áẠáá áºá á¯á¶áá áºáá¬áááááá¯ááºáá±á¬ á¡áááºááŸááºáá±áá°áá»á¬ážáááºáž áá«áááºááŒá±á¬ááºáž ááœá±á·ááŸáááá«áááºá
holivars áááááºáááºáá»á¬ážá¡ááœááºá ááááááŒá áºáááºááŸá¬ áááºáááºááŸááá±ááẠ- BOF session "Go vs. C++" á Session áá áááºáá®ááœáẠGo lover á C++ áá»á áºááŒááºááá¯ážáá° áá áºáŠážááᯠáá°áá±á¬ááºáᬠáá±á«ááºážá ááºáá áºáá¯á¡ááœáẠáááá¯áẠ100500 ááᯠá¡áá°ááᜠááŒááºáááºááŒááẠ(C++ ááŸá áááºáá±á·áá»áºáá»á¬ážááŸáá·áº ááŒá¿áá¬áá»á¬áž ááá¯á·ááá¯áẠGo ááœáẠgenerics áááŸáááŒááºážáá²á·ááá¯á·)á ááá¯á·áá±á¬áẠáááºážááá¯á·ááẠá¡áá»ááºážáá»ááºáž áááºááŒáœá áœá¬ ááœá±ážááœá±ážááŒáááºá ááááááºááŸáá·áºá¡áá°á ááááááºááẠá¡ááŒááºááŸá áºáá¯ááᯠáá áºááŒáá¯ááºááẠáá¬ážáááºááẠááŒáá¯ážá á¬ážáááºá á¡áááºá holivar ááẠáááºá ááºááŸá¯áááŸááá² á áááºáá«áá ááááºážááŸááá°á០ááŒá¬ážáááºáá±á¬ááºááœááºáá±ážááŒá®áž áá«áá®áá»á¬ážááᯠááŒááºáááºááá·áºááŒááºá á±áá«áááºá á€áá±á¬áºáááºááẠá áœá²áááºážá á±áááº- á áááºááŒá®ážáá±á¬áẠáá¬áá®á¡áá±á¬áºááŒá¬ááœáẠáááá¯ááºáá»á¬ážá áá áºáááºáᬠááŒá®ážááŒá±á¬ááºáá²á·áááºá á¡áá¯á¶ážááᯠá¡ááœááºá¡ááŸáááºááŒáŸáá·áºáá²á·ááááºá
-
á¡áá±á¬áº áááºáááº
áá®áá¬áá¶ááá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážá¡á¬áž áááºážááá»á¬ážááœáẠááá¯ááºá á¬ážááŒá¯ááŒá®áž - áááºááŸáááá±á¬áá»ááºáá»á¬ážá¡ááŒá±á¬ááºáž ááœá±ážááœá±ážááŒááŒá®áž á¡áá¯ááºáááºáá»á¬ážááŸáá·áº á¡áá¯ááºá¡ááá¯ááºáá»á¬áž áááºážááŸááºážááŒááºážá áá¬ááºá ááºážááá±á ááá»á¬ážááŸáá·áº ááŒáá¯ááºááœá²á¡áá±ážá á¬ážáá»á¬áž áá»ááºážáááŒááŒá®áž áá¯áááºáá±á¬ááºáá»á¬ážáááºáž áá»á®ážááŒáŸáá·áºáá«áááºá áá áºáá»áááºáááºážááŸá¬áááºá á¡áá»áá¯á·áá±á¬áá¯áá¹ááá®áá»á¬ážááẠá¡á á®áááºáá¶á á¬áá»á¬ážááᯠáá¬ážáá±á¬ááºáá¯á¶áá¬áá áá¬áá±á¬ááºáá°áá»á¬ážá¡ááœááºáá« á¡áá¯á¶ážáááºááá¯ááºá á±ááá·áº á¡ááºáá¬áá»á°ážáá»á¬ážá áááŠážá¡ááá·áºáá»á¬ážááᯠááŒááºáá»á±á¬áºááẠáááºážááŸááºážáá²á·áááºá
áááºážááá¬ááá¯ááºáá¬á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááá¯áá±á¬áºááŒáááºá
ááŸá áºáááºáá¯á¶ážáá¯á¶áž ááááºážááœá± áá¬ážáá±á¬ááºáááºá áá áºáá«ááá¶ááŸá¬ á¡ááŒáá¯ááºá¡ááá¯ááºááœá±ááá± á¡á á®áááºáá¶á á¬áá áºáá¯ááᯠááœá±ážááááºááẠ- á¡á¬ážáááºáá»áááºááŸá¬ áááŸááá²á·áá²á· á¡ááááá¬ááœá±ááᯠááœá²ááŒá®áž áááŸááºááá¯á· ááá±á¬áá°áá²á·ááŒáááºá áá«áá±á¬ááºá០á¡áá»á¬ážááŒá®ážáá»ááºáá±áá¯á¶ááááºá á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶áž ááœá±á·ááŸááááá·áº á¡á á®áááºáá¶á á¬á¡áá»áá¯á·á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá¡ááŒá±á¬ááºáž ááœá±ážááœá±ážááá¯áá«áááºá
C++ ááŸá ááŒáœááºážáá»áẠáá»á¬ážááᯠcompiler optimizations á prism á¡á¬ážááŒáá·áº Roman Rusyaev
áá»áŸá±á¬
áá±á«ááºážá ááºá á¡ááŒá¶ááŒá¯áá¬ážááá·áºá¡ááá¯ááºážá Roman ááẠLLVM ááᯠá¡áá¯á¶ážááŒá¯á ááŒáœááºážáá»ááºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážááᯠá¥ááá¬áá áºáá¯á¡áá±ááŒáá·áº ááŒáá·áºááŸá¯áá²á·áááºá áá áºáá»áááºáááºážááŸá¬áááºá áááºážááá¯á·ááá¯ááºáááºážááœáẠClang ááá¯á¡áá¯á¶ážáááŒá¯áá°áá»á¬ážá¡ááœááºá á¡á á®áááºáá¶á á¬ááẠáá¯ááºááᯠá¡áá±á¬ááºážáá¯á¶ážááŒá áºá¡á±á¬áẠáááºááá¯á·ááŒá¯áá¯ááºááá¯ááºáááºááᯠá¡ááŒá¶áá¬ááºá¡áá»áá¯á·áá±ážááá¯ááºáá«áááºá ááá¯ááá¯á·ááŒá áºáááŒááºážááŸá¬ compilers áá»á¬ážááŸáá·áº áááºááá¯ááºáᬠstandard libraries áá»á¬ážá developer áá»á¬ážááẠáá áºáá¯ááŸáá·áºáá áºáᯠáááºááœááºááŒááŒá®áž á¡á±á¬ááºááŒááºáá±á¬ solution á¡áá»á¬ážá¡ááŒá¬ážááẠááá¯ááºááá¯ááºááá¯ááºáá±á¬ááŒá±á¬áá·áºááŒá áºáááºá
ááá¯á·ááŒá±á¬áá·áºá ááŒáœááºážáá»ááºáá áºáá¯á¡á¬áž ááá¯ááºááœááºááẠáááºááẠá¡áá¬áá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº- ááá¯ááºááœááºááŸá¯áá¯áẠ(ááŸááá«á) ááá¯á·ááá¯áẠáááºááŸáá¡ááá·áºááŸá á¡ááá²á·á¡áááºážá¡ááŒá áºáá»á¬ážááᯠáá¯ááºážáá±á«áºááá¯áᬠá¡á á¯á¡áá±ážááᯠááá¯ááá¯ááŒáá·áºáá¬ážá¡á±á¬áẠááŸáá·áºáááºááá¯ááºáá«á á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠcompiler ááẠááŒáœááºážáá»ááºáá¬ážááá¯ááºááá·áº áá±á«áºááá¯ááŸá¯áá»á¬ážá¡ááœáẠáááºáá±á¬ááºážááœáŸááºááŒá¬ážáá»ááºáá»á¬áž ááá·áºáá±ážáááºáá°áá±á¬á¡áá»ááºááᯠáŠážáááºá á±áááºá ááá¯á·ááŒá±á¬áá·áºá ááŒáœááºážáá»áẠá¡ááŸááºáááẠááá±á«áºáá±á«ááºáá«áá áááá¯ááááºááẠáááá¯á¡ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáááºáááºáá¯ááºáá±á¬ááºáá±áááºááŒá áºáááºá á¡áá±á«áºáá¶ááᯠáá áºáááºážáááºážáá²á· áá»áŸá±á¬á·áá»áááºá¡ááœáẠLLVM ááœáẠááŒáœááºážáá»ááºááá¯ááºááœááºááŸá¯áá¯ááºááᯠáááºááá·áºááẠáááá¯á¡ááºáá« ááá¯á·ááá¯áẠ"á¡ááá¯" ááœáŸááºááŒá¬ážáá»ááºáá»á¬áž á¡áá±á¡ááœááºááᯠáá»áŸá±á¬á·áá»ááá¯ááºááá·áº á¡ááŒá±á¡áá±áá»á¬ážááᯠáá¯á¶ážááŒááºáááºá¡ááœáẠááœá±ážáá±á«áºááŸá¯áá»á¬ážá áœá¬ ááŸááá«áááºá
á áá®áá¬ááẠáááºážááá¯á·áá²á០áá áºáá«áááºááá·áºááᯠá á áºáá±ážááŒá®áž áááá¯áááẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠá¡ááŸáááºááŒáŸáá·áºááẠáá°áá®áá±ážááá·áº á¡ááŒá±á¡áá± ááŸá áºáá¯á áá¯á¶ážááŸáá·áº á€áááºážáááºážáá»á¬áž á¡áá¯á¶ážáááŒá¯ááá¯ááºáá±á¬ á¡ááŒá±á¡áá±áá»á¬ážááᯠááŒááááºá
ááá¯á·ááŒá±á¬áá·áº Roman Rusyaev ááẠáá»á±á¬ááºážáá¬ážáá»á¬ážá¡á¬áž ááŒáœááºážáá»áẠááá¯ááºááœááºááŒááºážáá«ááŸááá±á¬ áá¯ááºá¡á¬áž áááá¯á¶ážáá»á¯ááºá¡áá±ááŒáá·áº á¡ááŒá²áááºáž áá¯áááŒáá·áº áá¯ááºáá±á¬ááºá ááááá¯ááºááŒá±á¬ááºáž áá±á¬ááºáá»ááºáá»áᬠá¡á±á¬ááºáá« á¡ááŒá¶áá¬ááºááᯠáá±ážáááº-
- á á¬ááŒáá·áºááá¯ááºáá»á¬áž ááœá¶á·ááŒáá¯ážáá¬áá±á¬á¡áá« áá°á¡á ááŒáœááºážáá»ááºáá»á¬ážááᯠá áœáá·áºááœáŸááºááá·áºáááºá
- ááŒáœááºážáá»ááºáá»á¬áž ááá¯á¡ááºáá±áá±ážáá«áá ááŒá áºááá¯ááºááá»áŸ á¡áá»áááºááá¯ááºážááœáẠcompiler ááᯠáááºááá¯ááºááá»áŸ optimize ááŒá¯áá¯ááºááá¯ááºááẠnoexception (and const) modifiers áá»á¬ážááᯠáá±áá¬ááá¯ááºážááœáẠáá±á«ááºážááá·áºááá·áºáá«áááºá
áá±áá¯áá»á¡á¬ážááŒáá·áºá ááŒáœááºážáá»ááºáá»á¬ážááᯠá¡áááºážáá¯á¶áž ááá¯á·ááá¯áẠá¡á¬ážáá¯á¶ážááᯠá áœáá·áºááœáŸááºááẠá¡áá±á¬ááºážáá¯á¶ážááŒá áºááŒá±á¬ááºáž áá±á¬ááŒá±á¬áá°á á¡áááºááŒá¯áá²á·áááºá
á¡á
á®áááºáá¶á
á¬áááá¯ááºáá»á¬ážááᯠá¡á±á¬ááºáá«ááá·áºááºááœáẠáááŸáááá¯ááºáá«áááºá
áá»ááºááá±áá¬áá»á¬ážá áá¯ááºááá¯ážáá¯ááºá ááºáá»á¬ážááŸáá·áº á¡ááŒá¬ážáá±á¬ áŠážááŸá±á¬ááºááᯠááŸá¯á¶á·áá±á¬áºáá±ážááá·áº áá»áá¯ááŒáááºáá±á¬ Adi Shavit
áá»áŸá±á¬
C++20 ááœáẠáááºážáá áºáá®ááœááºááŸá¯áá»á¬ážááᯠáááºá á°ážáá¬ážáá±á¬ á€ááœááºáááá·áºááœáẠá¡á á®áááºáá¶á á¬áá»á¬ážá áœá¬áá²á០áá áºáá¯ááẠáááºážá áá±á¬ááºá á¯á¶áááºáááºááŸá¯á¡ááœááºáá¬áá á á¯á ááºážááŸá¯áá¯ááºáá±á¬ááºááŒááºážááá¯ááºáᬠáá¯áá¹áááá±á ( loop á callbacks ) ááŸáá·áº áááºááŸáááŒá¿áá¬áá»á¬ážááᯠááŸááºážáááºážáá±á¬áºáá¯ááºááŒááºážá¡ááœááºáá« á¡ááŸááºááááŒá áºá á±áá«áááºá
Adi Shavit ááẠá¡á±á¬ááºáá«ááá¯á·ááᯠáá®ážáá±á¬ááºážááá¯ážááŒáááº- áááºááŸááááŸáááá¯ááºáá±á¬ áááºážáááºážáá»á¬ážááẠá á¯á ááºážááŸá¯áá áºáá¯áá¯á¶ážááᯠááŒááºáááºážááœá¬ážááŒá®áž á¡áá»áá¯á·áá±á¬ á¡ááœááºážááá¯ááºáž á¡áááºá¡áááºá¡ááŒá±á¡áá±ááá¯á· áááºáá±á¬ááºááœáá·áºááá±ážáá« (ááá¯á·ááá¯áẠáááºážááá¯á·ááẠááŒááºáá±á«áºááŒááºážááá á¹á ááœáẠááŒá¯áá¯ááºáá±á¬áºáááºážá Callback Hell áá²á·ááá¯á·áá±á¬ áááŸá áºááŒáá¯á·ááœááºáá±ážááœááºááá¯ážáá»áá¯ážáá»á¬ážá áœá¬ááŒáá·áº) . áááºáá«ááá²áá² áá¯ááºáá±áá¯á¶ááááºá ááá¯á·áá±á¬áº áááºážááá¯á·ááŸáá·áºááẠá¡áá¬áá¬ááẠáá»á±á¬ááœá±á·áááºááá¯ááºáá±á áá¯á¶áááºáá±á«ááºááŸáá·áº ááœááºáá±á«ááºá¡ááŸááºáá»á¬áž áááŸááá« (á¡á â á¡áá¯á¶ážááŸáá·áº rbegin â áá¯ááºááŒááºážá áááºááŒáá·áº) áááºáá»áŸááŒá¬ááŒá¬ áááºáá±á¬ááºážáááºááᯠáá»áœááºá¯ááºááá¯á· áááŸááºážáááºážáá«á C++20 ááŸá áááºá á€ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááá¯ááºáá«ááŒá®á
áááááœá±ážáá»ááºááŸá¯- á¡ááá¯ááºážá¡ááŒá¬ážá iterator áá»á¬ážááᯠáá¯ááºááá¯ážááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáááºáá¬áááºáá¬áá áºáá¯á á¡á ááŸáá·áºá¡áá¯á¶ážá¡ááœáẠáá¯á¶á¡ááºáá¬áá±á·á áºáá áºáá¯ááᯠáááŸáááŒá®áž áá±ážááœá²á·ááá¯ááºá áœááºážááá¯áááºáž áááŸááá«áááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááẠááŒáá·áºá á¯á¶áá±á¬ áá±áá¬á á®áá¶áá±á¬ááºááœááºáá±áž ááá¯ááºááá¯ááºážáá»á¬ážááᯠáááºáá±á¬ááºááẠááœááºáá°á á±áááºá ááá¯á·áá±á¬áº á¡áá¬á¡á¬ážáá¯á¶ážááẠá€áá»áŸáá»á±á¬ááœá±á·áááºááá¯ááºáá±- ááœááºáá»ááºááŸá¯áá¯áá¹ááááá áºá áááºáá áºááá¯ááºážááẠáá¯ááºááá¯áá¬ážáááºáááºááŸáá·áº á¡ááŸá¬ážááŸá¬ááẠááŸá¯ááºááœá±ážá á±ááá¯ááºááá·áº áá®ážááŒá¬áž iterator áá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡ááœááºážááœáẠáááºááŸááá«áááºá
áá»áŸá±á¬
á€ááá á¹á á¡ááœááºá C++20 ááẠPython ááŸá áá»ááºááá±áá¬áá»á¬ážááŸáá·áº áááºáá°ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááá·áºááœááºážáá¬ážáááº- á¡áááºá¡áááºá¡ááŒá±á¡áá±áá áºáá¯ááᯠááááºážááááºážáá¬ážá áẠáááºááŸááááºááá¯ážá¡áá»áá¯á·ááᯠááŒááºáá±ážááŒááºážááŒáá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠááœáŸá±á·ááá¯ááºážááá¯ááºáááºá ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá±á«áºáá¬ááá·áºá¡ááá¯ááºáž áá±áá¬áá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáá¯á¶áá¬áá áááá»áá±á¬ áá±á¬áºááá¯áááºážáá áºáá¯á¡ááœááºážá áá¯áá¹áááá±áá¡á¬ážáá¯á¶ážááᯠáá¯á¶ážá¡á¯ááºáá¬ážáááºá
ááá¯á·áá±á¬áº ááá±á¬ááºážááá¯ááºááœáẠáááºáá±á¬ááºáá»á¬áž ááŸááá±áááº- ááá¯á¡áá»áááºááœáẠáááºážááá¯á·ááᯠááŸáááŒá®ážáá¬áž compilers áá»á¬ážá áá áºá áááºáá áºááá¯ááºážáᬠáá¶á·ááá¯ážáá¬ážááŒá®ážá áá»áœááºá¯ááºááá¯á· á¡ááá¯ááŸáááá±á¬áẠáááºáááºá áœá¬ á¡áá±á¬ááºá¡ááẠááá±á¬áºááá¯ááºáá±ážáá«- á¥ááá¬á áá±á¬áºááá¯ážáááºáá»á¬ážááœáẠá¡ááá¯ážá¡áá¬ážáá»á¬ážááŸáá·áº áá¬áá®á¡áá¬ááá¹áá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠáááá¯ááºáááºáá±ážáá«á ááá¯á·á¡ááŒááºá coroutines áá»á¬ážááŒá áºááá¯ááºááá·áºá¡áá¬á¡áá±á«áº ááá·áºáááºáá»ááºáá»á¬ážá¡áá»áá¯á·ááŸáááŒá®áž constexpr áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá constructors/destructors ááŸáá·áº main ááᯠá€á á¬áááºážááœááºááá«áááºáá«á
ááá¯á·ááŒá±á¬áá·áºá coroutines áá»á¬ážááẠdata processing logic áááá¯ážááŸááºážááŸá¯ááŸáá·áº ááŒá¿áá¬áá»á¬ážá áááá¬áááºááŸá¬ážáá±á¬á¡á áááºá¡ááá¯ááºážááá¯ááŒá±ááŸááºážááá¯ááºáá±á¬áºáááºáž áááºážááá¯á·ááááºááŸáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááẠááá¯ážáááºááŸá¯ááá¯á¡ááºáá«áááºá
áá á¹á ááºážáá»á¬áž:
- C++ áá¯ááŸá¬ážá០áááá¯ááºáá»á¬áž -
["áá®ážá ááºáá»á¬ážá áá¯ááºááá¯ážáá¯ááºá ááºáá»á¬ážááŸáá·áº á¡ááŒá¬ážáá±á¬ áŠážááŸá±á¬ááºááᯠááŸááá·áºáá±ážááá·áº áá»áá¯ááŒáááºááŸá¯"] CppCon 2019 á០á¡á á®áááºáá¶á ᬠáá®áá®ááᯠááá¯ááºáá°ážááŒááºážá
Yandex.Taxiá Anton Polukhin á០C++ ááŸáá·áºááœááºáá»á¬áž
áá»áœááºá¯ááºáááá±á¬áºáááºááŸááºáááºááŸá¯ááºááŸá¬ážááŸá¯áá»á¬ážááœááºá áá áºáá«áá áºáá¶ááœáẠáá»áœááºá¯ááºááẠá¡áááºá¡áá¬áá»á¬ážááᯠáááºáááºá¡áá±á¬ááºá¡áááºáá±á¬áºááá«áááº- á¡áá»áá¯á·áá±á¬á á¬ááŒáá·áºááá¯ááºáá»á¬ážá á¡ááœááºážááá¯ááºážá¡ááºáá¬áá±á·á áºááŸáá·áº API á¡ááŒá¬áž ááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááºá ááŸááºáááºážááŸááºááŒááºáž ááá¯á·ááá¯áẠááœá²ááŒááºážá áááºááŒá¬ááŒááºážá á€ááá á¹á ááœááºá á¡áá»á¬ážá¡á¬ážááŒáá·áº áááºááá·áºá¡ááᯠoptimization ááŒá¯áá¯ááºáááºáááá¯á¡ááºáá«á ááá¯á·áá±á¬áº RuNet áá±á«áºááŸá áá±áááºážá¡á á¬ážáá¯á¶áž áááºáá±á¬ááºááŸá¯á¡áá»áá¯á·ááœáẠá€á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«á á¡áááºáááºážá ááá¯ááá¯á·áá±á¬á¡ááŒá±á¡áá±áá»áá¯ážááœáẠáááºááẠááŸááºáááºážáá»á¬ážá áá áºáá¬áá®áá»áŸáẠáá¬áá¬ááá¯ááºáá»á¬ážááᯠáá áºáá±á¬ááºáááºáž áá¯ááºáá±á¬ááºááááºááŒá áºáá«áááºá ááá¯á·áá±á¬áẠáá®áá®á áá¹ááá·áºááá¯ááºáž áá±ááœááºááẠááá¯á·ááŒá±á¬áá·áº áááºááẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ááŸáá·áºááœááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºááẠ- Anton Polukhin á áááºážááá¯á·á¡ááŒá±á¬ááºáž ááŒá±á¬ááá¯áá²á·áááºá
á áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶áž á¥ááá¬ááŸá¬ pointer-to-implementation (pimpl) áá¯á¶á á¶ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŒá áºááá¯ááºáááºá
#include <third_party/json.hpp> //PROBLEMS!
struct Value {
Value() = default;
Value(Value&& other) = default;
Value& operator=(Value&& other) = default;
~Value() = default;
std::size_t Size() const { return data_.size(); }
private:
third_party::Json data_;
};
á€á¥ááá¬ááœááºá ááááŠážá áœá¬ áá»áœááºá¯ááºááẠááŒááºáá á¬ááŒáá·áºááá¯ááºáá»á¬ážá áá±á«ááºážá á®ážááá¯ááºáá»á¬ážááᯠáááºááŸá¬ážáá áºááá¯áá«áááº- áááºážááẠááá¯ááá¯ááŒááºáááºá áœá¬ á á¯á ááºážáá±ážáááºááŒá áºááŒá®áž ááŒá áºááá¯ááºáá»á±ááŸááá±á¬ á¡áááºááœá²ááœá²ááŸá¯áá»á¬ážááŸáá·áº á¡ááŒá¬ážáá±á¬ á¡áá¬ážáá°á¡ááŸá¬ážá¡ááœááºážáá»á¬ážá០ááá·áºááá¯ááºááẠáá¬ááœááºááá¯ááºáá«áááºá
áá±á¬ááºážááŒá®á áá»áœááºá¯ááºááá¯á·ááẠ#include ááᯠ.cpp ááá¯ááºááá¯á· ááœáŸá±á·ááá¯ááºáááº- áá»áœááºá¯ááºááá¯á·ááẠwrapped API á ááŸá±á·ááŒá±ážááŒá±ááŒá¬áá»ááºá¡ááŒáẠstd::unique_ptr ááá¯á¡ááºáá«áááºá ááᯠáá»áœááºá¯ááºááá¯á·ááœáẠáá±áá¬á¡ááŒá±á¬ááºá¡áá»á¬áž ááŒáá·áºáá»á²áá±áá±á¬ áá±áá¬ááŸáá·áº á¡á¬ááá¶áá»ááºáá»áŸá±á¬á·áááºážááŒááºážáá²á·ááá¯á·áá±á¬ áááºááŒáœáá±á¬ ááœá²áá±áá»áá¬ážááŸá¯áá»á¬ážááŸáá·áº á¡ááŒá¬ážáááŸá áºááŒáá¯á·ááœááºá¡áá¬áá»á¬ážááŸááááºá std::aligned_storage ááẠá€á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá°áá®ááá¯ááºáá«áááºá
struct Value {
// ...
private:
using JsonNative = third_party::Json;
const JsonNative* Ptr() const noexcept;
JsonNative* Ptr() noexcept;
constexpr std::size_t kImplSize = 32;
constexpr std::size_t kImplAlign = 8;
std::aligned_storage_t<kImplSize, kImplAlign> data_;
};
áá áºáá¯áááºážáá±á¬ááŒá¿áá¬- wrapper áá áºáá¯á á®á¡ááœáẠá¡ááœááºá¡á á¬ážááŸáá·áº áá»áááºááŸáááŸá¯ááᯠáááºáááºááŸááºááẠááá¯á¡ááºááẠ- áá»áœááºá¯ááºááá¯á·á ppimp template ááᯠááá·áºáááºáá»ááºáá»á¬ážááŒáá·áº ááŒá¯áá¯ááºááŒáá«á áá¯á·á á á¡áá»áá¯á·áá±á¬ áááá¬ážáá±á¬áááºááá¯ážáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž áá»áœááºá¯ááºááá¯á·á¡áá¬áá¬ááŸááºááŒá±á¬ááºážááᯠdestructor ááá¯á· check áá áºáá¯ááá·áºáá«-
~FastPimpl() noexcept {
validate<sizeof(T), alignof(T)>();
Ptr()->~T();
}
template <std::size_t ActualSize, std::size_t ActualAlignment>
static void validate() noexcept {
static_assert(
Size == ActualSize,
"Size and sizeof(T) mismatch"
);
static_assert(
Alignment == ActualAlignment,
"Alignment and alignof(T) mismatch"
);
}
T ááẠdestructor ááá¯áá¯ááºáá±á¬ááºáá±á¬á¡áá«ááœááºáááºááŸááºáá¬ážááŒá®ážááŒá áºáá±á¬ááŒá±á¬áá·áºá á€áá¯ááºááá¯ááŸááºáááºá áœá¬ááœá²ááŒááºážá áááºááŒá¬ááŒá®ážá á¯á ááºážááŸá¯á¡ááá·áºááœááºá¡ááŸá¬ážáá»á¬ážá¡ááŒá áºááá·áºááœááºážáááºááá¯á¡ááºáá±á¬á¡ááœááºá¡á á¬ážááŸáá·áºáá»áááºááŸáááŸá¯áááºááá¯ážáá»á¬ážááá¯áá¯ááºáá±ážáááá·áºáááºá ááá¯á·ááŒá±á¬áá·áºá áá±á¬ááºáááºá á¯á ááºážááŸá¯áá áºáá¯áá¯ááºáá±á¬ááºááŒááºážááá¯ááºáá»á ááááºááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááá¯ážáá¬ážáá±á¬á¡áááºážáá»á¬ážá áááºááŒáœá áœá¬ááœá²áá±áá»áá¬ážááŸá¯ááᯠáááºááŸá¬ážááŒá®áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááŸáá·áºá¡áá° .cpp ááá¯ááºááœáẠAPI ááᯠááŸááºáá¬ážáᬠáááá¯áááºáá¬á០ááááºážáááºážáááºá¡ááœáẠááá¯ááá¯ááá·áºáá»á±á¬áºáá±á¬ áá®ááá¯ááºážááá¯áááºáž áááŸááááºááŒá áºáááºá
ááŸááºáááºážáááºááŒááºážááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŒááºážááẠá¡áááºááŒá®ážáá±á¬ááºá áá¬áá¯á¶áá±á«ááºáá±á¬ááŒá±á¬áá·áº á€áá¯á¶ážáááºáá»ááºááœáẠáá±á¬áºááŒáááºááá¯ááºáá«á
á¡á
á®áááºáá¶á
á¬áááá¯ááºáá»á¬ážááᯠá¡á±á¬ááºáá«ááá·áºááºááœáẠáááŸáááá¯ááºáá«áááºá
Björn Fahller ááá·áºáá¯ááºááᯠááŒá±á¬ááºááœá±á·á¡á±á¬ááºáá¬ážááẠáá±ááºáá®áááºážááá¬áá»á¬áž
á€áá±á¬ááŒá±á¬áá»ááºááœááºá Björn Fahller ááẠáááºáá«ááá²áá² á á áºáá±ážááŸá¯áá»á¬ážá áá¯á¶ááá¹áá¬ááºáá»áá¯á·ááœááºážáá»ááºááᯠááá¯ááºáá»ááºááẠááá°áá®áá±á¬áááºážáááºážáá»á¬ážá áœá¬ááᯠááŒááááº-
assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);
á¡áá¶áá±á¬ áááºážááŸá®ážáá¬áž? áááŒá¬áá±ážáá®á á á¶áá»áááºá á¶ááœáŸááºážáá»á¬ážááœáẠááááºáááºáá²á·áá±á¬ á¡á¬ážáá±á¬ááºážááá·áº C++ áááºážááá¬áá»á¬ážá áœá¬ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áºá á áœááºážáá±á¬ááºááẠááŒá áºáááºáá±ážááŒááºážáááŸááá² áá°áá®áá±á¬áá¯ááºáá±á¬ááºáá»ááºááᯠá¡á¶áááºááœááºáá» á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá«áááºá ááŸáá¯ááºážááŸááº-
assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));
ááááºáááŒáááºáá±á¬ á á áºáá±ážááŸá¯á¡áá±á¡ááœááºááᯠááá¯ááºááœááºáááºá áááºááẠáá»ááºáá»ááºáž ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áá¯á¶á á¶áá»á¬ážááŸáá·áº á áá¬ážáááºáá»á¬ážááᯠáá±á«ááºáá¬ážááẠááá¯á¡ááºáááºá enum á state_type ááŒááºá ááºá¡ááœáẠááááºážááŸááºáá»á¬ážá áœá¬á áááºážáá°áá®áá»áŸááŸá¯ááᯠá á áºáá±ážááá¯áááºáᯠáá°áááŒáá«á áá¯á·á ááááá¯á¶ážá áááºáá²áá±á«áºáá¬áá¬á helper function is_any_of:
enum state_type { IDLE, CONNECTED, DISCONNECTED };
template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) {
return ((s == ts) || ...);
}
áá®á¡áááºá¡áááºááááºá á áááºáá»ááºá áá¬áá«á á¡áá¯á¡áá»áááºá¡áá áá¯ááºááᯠáááºááá¯á· áááá±á¬á·áá«á
assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED));
á¡áá»áá¯ážá¡á á¬ážááá¯ááºáá±á¬ áá¯á¶á á¶áá±á¬ááºáá«áá¬áá®áá¬áá»á¬ážááẠá¡ááŒá±á¡áá±ááᯠá¡áááºážáááºááá¯ážáááºá á±ááẠáá°áá®áá±ážáá«áááºá áááºážááá¯á·áá¡áá°á¡áá®ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠenum á ááá±ááœááºááá¯ááºáá±á¬ááŒááºá ááºáá»á¬ážááᯠááá°áá¬áá±á¬ááºáá»á¬ážá á¬áááºážááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážáá«áááºá
template <state_type ... states>
bool is_any_of(state_type t) {
return ((t == states) | ...);
}
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state));
á¡áá»áá¯ážá¡á á¬ážááá¯ááºáá±á¬ áá¯á¶á á¶ááœááºáá«áá¬áá®áᬠ(C++17) ááœáẠá¡ááá¯á¡áá»á±á¬ááºá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áºá áá»ááºážáááºááŸá¯ááẠstate_type ááŒááºá ááºáá»á¬ážááŸáá·áºáá¬áá á¡áá»áá¯ážá¡á á¬ážááá¯ááºáá±á¬ áá¯á¶á á¶áá±á¬ááºááá·áºáááºáá»ááºáá»á¬ážá¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº ááá¬áá¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŸáá·áº ááŸáá¯ááºážááŸááºááŸá¯áá»á¬ážááᯠááá¯ážááŸááºážá á±áááº-
template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
return ((t == alternatives) | ...);
}
á€ááá¯ážáááºááŸá¯áá»á¬áž áááºááá¯ááºáá¯ááºáá±á¬ááºááŒááºážááŒáá·áºá á á áºáá±ážááŸá¯áá»á¬ážá¡ááœáẠá¡ááá¯ááŸááá±á¬ áá»áœááºážáá»ááºáá±á¬ á¡áá¬ážá¡ááá¯ááᯠá¡á±á¬ááºááŒááºáááº-
template <class ... Ts>
struct any_of : private std::tuple<Ts ...> {
// пПлеМОЌÑÑ Ðž ÑМаÑлеЎÑеЌ кПМÑÑÑÑкÑПÑÑ ÐŸÑ tuple
using std::tuple<Ts ...>::tuple;
template <typename T>
bool operator ==(const T& t) const {
return std::apply(
[&t](const auto& ... ts) {
return ((ts == t) || ...);
},
static_cast<const std::tuple<Ts ...>&>(*this));
}
};
template <class ... Ts>
any_of(Ts ...) -> any_of<Ts ... >;
assert(any_of(IDLE, DISCONNECTING, DISCONNECTED) == state);
á€á¥ááá¬ááœááºá á¡áá¯ááºááá¹ááá¬áááºážááœáŸááºááẠconstructor arguments á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááá¯áááá±á¬ compiler ááá¯á·á¡ááá¯ááŸááá±á¬ááœá²á·á ááºážáá¯á¶áá¯á¶á á¶áá±á¬ááºáá»á¬ážááá¯á¡ááŒá¶ááŒá¯áááºáá¯ááºáá±á¬ááºáááºá
áá±á¬ááºááẠ- ááá¯á áááºáááºá á¬ážááá¯á·áá±á¬ááºážáááºá Bjorn ááẠ== áááºáá»á±á¬áºááœááºáá±á¬ ááŸáá¯ááºážááŸááºá¡á±á¬áºááá±áá¬áá»á¬ážá¡ááœáẠááœááºáá±á«áºáá¬áá±á¬áá¯ááºááᯠáá±áá°áá»áá¯á¶áá±á¬áºááŒáááºážááᯠáááºáá±ážáááºá ááá¯á·áá±á¬áẠááááºáááá¯áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœááºá áááºážáá áºáá»áŸá±á¬ááºááœááºá no_unique_address attribute (C++20) ááŸáá·áº lambda functions (C++20) ááŸá ááá°áá¬áá±á¬ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŸááºážááŒáá¬ážáá«áááºá (áá¯ááºáá«áááºá á¡áᯠlambda syntax á ááá¯ááá¯á·áá±á¬áẠááŸááºááá ááá¯ááœááºáá¬áá«ááŒá® - á¡á²áá«ááœá±áᬠá¡áá»áá¯ážá¡á á¬ážá¡á¬ážáá¯á¶ážáá²á· ááœááºážá¡ááœááºáž á¡ááœá²áá±ážááœá²áá«á) áá±á¬ááºáá¯á¶ážááŒá±ááŸááºážáá»ááºá¡áá±áá²á· constructor details á¡ááŒá Ạfunctions ááœá±ááá¯áá¯á¶ážááŒá®áž lambda áá²á· á¡áá±á¬ááºážáá¯á¶áž ááá±á·áá¯á¶ážáááºážááœá±ááŸá¬ tuple ááá¯áá²á· á áá¬ážáááºááᯠáááŒá±á¬áá² áá»áœááºáá±á¬á·áºá áááºáááá¬ááºááᯠááááºááœá±ážááœá±ážá á±áá«ááẠáá¯á
á¡áá¯á¶ážááœááºá ááœááºááá¯ááºáááºááá±á·áá«ááŸáá·áºá
- lambdas áá»á¬ážááẠconstexpr á¡ááá²á·ááŒá áºááŒá±á¬ááºáž áááááá«á
- ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áááºááá·áºááá¯á·ááŒááºážááᯠáá±á«ááºážá lambda ááááºááŒááºážááŸá parameter pack ááŸáá·áºáááºá ááºáá±áá±á¬ áááºážááá¯ááºááá¯ážáá±á¬ syntax ááá¯ááŒáá·áºááŒáá«á áá¯á·á
- ááœááºááŒá°áá¬á¡á¬áž á¡ááŒá±á¡áá±á¡á ááŒáœááºážáá»ááºáááŸá ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááẠá¡ááœáá·áºá¡áá±ážáá»á¬áž áá±ážááŒáá«á áá¯á·á
- lambdas á ááŸááºážáááºážááŒááºáá¬ážáá±á¬ ááŒááºáá±ážááá·áºáááºááá¯ážáá»á¬ážááᯠáá»á±ážáá°ážáááºááŸááá±á¬ááŒá±á¬áá·áº áá¯á¶á á¶áááááºáá»á¬ážááœáẠááá¯ááá¯áá¬ážáááºááá¯ááºáá±á¬ error output ááᯠááá¯á áá¯ááºááŒáá«á áá¯á·á áááºážááẠtemplate function ááᯠá¡ááŸááºááááºááá±á«áºáá® - type checking stage ááœáẠcompiler á¡á¬áž áá±á¬ááºáááºá á áºáá±ážááŸá¯áá»á¬ážááŒá¯áá¯ááºááẠááœááºážá¡á¬ážáá±ážáááºááŒá áºáááºá
á¡áá±ážá áááºááááŸáááá¯áá«á áááºááŒá¬ážáá±ážáá á¹á ááºážáá»á¬ážááᯠááŒáá·áºááŸá¯áá«á
- áááá¯ááºáá»á¬ážááᯠá¡á
á®áááºáá¶áááº-
[ááá·áºáá¯ááºááᯠááŒá±á¬ááºááœá±á·á¡á±á¬ááºáá¬ážááẠáá±ááºáá®áááºážááá¬áá»á¬áž] Github ááœáẠá¡áááºážá¡ááŒá áºáá¯áẠá á¬áá±ážáá°áááá±á¬á·ááºáá±á¬ááºážáá«áž
áá»áœááºá¯ááºááá¯á·á á¡áááºááŒá®ážááŸá¯á
C++ Russia ááœáẠáá»áœááºá¯ááºááá¯á·áááááá¯á¶ážáá«áááºááŸá¯ááẠáááºážáááŒááºážáááºááŸá¯á¡ááœáẠá¡ááŸááºááááŒá áºáá²á·áááºá áá±á·áá»áá·áºáá±ážáá²á· ááá¯ááºááá¯ááºáááºááœááºááŸá¯ááŒá¬ážá áá»ááºážááŒá±á¬ááºážá áááŒááºááá¯ááºáá¯áá®ážáá«ážááŒá áºáá²á· ááá¯ážáá¬ážáá²á·ááŒá áºáááºáá áºáá¯á¡áá±áá²á· C++ Russia ááᯠá áááºáááºážááŸááºáá²á· áá¶á á¬ážáááá«áááºá ááœá²áá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážáá¶á០ááŒáá¯ááºááœá²áá»á¬ážá¡áá áá±á¬ááŒá±á¬áá°á á áááºáá±á áááºáá¬ážá០á¡áá¬á¡á¬ážáá¯á¶ážááẠááœá±ážááœá±ážáá±á¬ ááœá±ážááœá±ážááŸá¯áá»á¬ážá¡ááœáẠá¡áá±á¬ááºá¡áá°ááŒá áºá á±áá«áááºá á¡á á®áááºáá¶á á¬áá»á¬ážáá«áááºáá±á¬ áá®áá¬áá¶áá¡ááŒá±á¬ááºážá¡áá¬ááẠC++ áá®ááœááºáááºážáá áºááŸá¯áá»á¬ážá ááŒá®ážáá¬ážáá±á¬ááá±á¬áá»ááºáá»á¬ážá ááŒá áºáááºáá±á·áá¬ááŸá¯áá»á¬ážááŸáá·áº á¡ááœá±ážá¡áá±á«áºáááá¯áá¬ááá¯ááºáᬠááá·áºááœááºážá ááºážá á¬ážááŸá¯áá»á¬ážá¡áá«á¡ááẠá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá áœá¬ááᯠá¡áá»á¯á¶ážáááºáá«áááºá ááá¯á·áá±á¬áº C++ ááŸáá·áºáá¬áá áá¬áá¬á áá¬ážááá¯ááºáᬠá¡áá¬ážá¡áá®ážáá»á¬ážááᯠáá»á±á¬áºááœáŸá¬ážááá¯ááºá á±ááá·áº á¡ááŒá áºá¡áá»ááºá áá°ááŸá¯áá±ážááá¯ááºáᬠá¡á áááºá¡ááá¯ááºážááᯠáá»á áºáá»á°ááŸá¯ááŒááºážááẠááá¬ážáá»áŸáááŸá¯ áááŸááá±á
áá®ááá¯ááœá²áá»áá¯ážááŸá¬ áá«áááºááœáá·áºááá²á·á¡ááœáẠáá®áá¬áá¶á
á®á
ááºáá°ááœá±ááᯠáá»á±ážáá°ážáááºáá«áááºá
C++ Russia á á¡ááááºá áá
á¹á
á¯áá¹áááºááŸáá·áº á¡áá¬áááºá¡ááŒá±á¬ááºáž á
á®á
ááºáá°áá»á¬ážá ááá¯á·á
áºááᯠáááºááœá±á·áá°ážáá±áááºá
áááºááŸá¯áá±ážááá·áºá¡ááœáẠáá»á±ážáá°ážáááºáá«áááºá áá»áœááºá¯ááºááá¯á·á á¡ááŒá
áºá¡áá»ááºáá»á¬ážááᯠááŒááºáááºááŒá±á¬ááŒááŒááºážááẠá¡áá±á¬ááºá¡áá°ááŒá
áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá
source: www.habr.com