Slide 1

Slide 1 text

$͔Β$·Ͱͷ มԽ ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ਫ $.*9

Slide 2

Slide 2 text

͸͡Ίʹ • લճͷ$.*9͕೥຤ͩͬͨͷͰɺ$ͷ࿩͕͋·Γ Ͱ͖͍ͯ·ͤΜͰͨ͠ • ͳͷͰࠓճ͸ɺ$ͷ͓͞Β͍ͱɺ$ͷ͔ΜͨΜͳ ঺հΛ͠·͢

Slide 3

Slide 3 text

͜Ε·ͰͷओͳΞοϓσʔτ಺༰Λ͓͞Β͍ バージョン 主なアップデート内容 C++98 (1998年) ISOで標準化された最初のバージョン C++03 (2003年) C++98で未規定だった仕様の補完 (C++98と同じだと考えていい) C++11 (2011年) 初期化⼦リスト、範囲for⽂、型推論、ラムダ式、スレッド、 スマートポインタなど C++14 (2014年) 2進数リテラル、数値リテラルの桁区切り⽂字など C++17 (2017年) 構造化束縛、optionalクラス、インライン変数、ファイルシステム など C++20 (2020年) ⽐較演算⼦の⾃動定義、⽂字列フォーマット、Range、 テンプレートパラメータの制約、数学定数など

Slide 4

Slide 4 text

$ൺֱԋࢉࢠͷࣗಈఆٛ • operator==Λఆٛ͢Δͱɺoperator!=͕ࣗಈఆٛ͞ΕΔ • operator<=>Λఆٛ͢Δͱɺoperator<ɺoperator<=ɺ operator>ɺoperator>=͕ࣗಈఆٛ͞ΕΔ • operator<=> ͷਖ਼໊ࣜশ͸ʮUISFFXBZ DPNQBSJTPOPQFSBUPS ࡾํൺֱԋࢉࢠ ʯɻӉ஦ધԋࢉࢠͱ΋ݴ͏ • memcmpؔ਺ͱಉ͡Α͏ʹɺ౳͍͔͠ɺখ͍͔͞ɺେ͖͍͔Λ Ұ౓ʹ൑ఆͰ͖Δ

Slide 5

Slide 5 text

$จࣈྻϑΥʔϚοτ • std::formatؔ਺͕ೖͬͨ • 1ZUIPO෩ͷॻࣜจࣈྻΛ࢖͍ɺॻࣜࢦఆͷจࣈྻΛੜ੒Ͱ͖Δ • QSJOUGͷΑ͏ʹܕΛॻࣜͰ͸ࢦఆͤͣɺҾ਺൪߸ ॻࣜΛࢦఆ͢Δ • ostringstreamΛ࢖͏ඞཁ͕ ͍͍ͩͨ ͳ͘ͳͬͨ • ॻࣜจࣈྻ͸ɺίϯύΠϧ࣌ʹνΣοΫ͞ΕΔ • constevalͳίϯετϥΫλʹΑͬͯจࣈྻϦςϥϧͷίϯύΠϧ࣌νΣοΫ Λ࣮ݱ͍ͯ͠Δ cout << format("{} {} {}", 3, 1.23, "hello") << endl; cout << format("{0} {0:#x} {1}", 15, "hello") << endl; 3 1.23 hello 15 0xf hello

Slide 6

Slide 6 text

$3BOHF • ίϯςφ΍ΠςϨʔλൣғͳͲͷ3BOHFʹର͢Δૢ࡞͕ఆٛ͞Εͨ • Ͱͷ஗ԆධՁͷ3BOHFΞμϓλʹՃ͑ͯɺͷ3BOHF൛ ͕std::ranges໊લۭؒʹఆٛ͞ΕΔ • ಈ޲తʹ͸ɺ৽نΞϧΰϦζϜ͸std::ranges໊લۭؒʹͷΈఆٛ͞ΕΔ໛༷ • $Ͱ3BOHFΞμϓλ͕͞Βʹͨ͘͞ΜೖͬͨɻΠϯσοΫε෇͖Ͱϧʔϓ͢Δ enumerateͱ͔ͱ͔ vector v = {1, 2, 3, 4, 5}; for (auto x : v | filter([](int x) { return x % 2 == 0 }) | transform([](int x) { return x * 3; })) { cout << x << endl; }

Slide 7

Slide 7 text

$਺ֶఆ਺ • ϔομʹɺstd::numbers::piͳͲͷ਺ֶఆ਺͕ఆٛ͞ΕΔ • $ίϯύΠϧ࣌ͷؔ਺ධՁ DPOTUFYQS • $ม਺ςϯϓϨʔτ • $ΠϯϥΠϯม਺ ϔομʹม਺ఆٛͯ͠΋࣮ମΛͻͱͭʹͰ͖Δ • $ίϯηϓτ • pi͕double൛ɺpi_v͕ςϯϓϨʔτ൛ template T degree_to_radian(T x) { return x * std::numbers::pi_v / static_cast(180.0); } template inline constexpr T pi_v = static_cast(3.14159265358979323846L);

Slide 8

Slide 8 text

$ • std::print() / std::println() • import std; • std::expected • ίϧʔνϯΛศརʹ࢖͏ͨΊͷstd::generatorΫϥε

Slide 9

Slide 9 text

$QSJOUQSJOUMO • std::format()ϕʔεͷग़ྗؔ਺ͱͯ͠ɺ std::print()ͱstd::println()͕ೖͬͨ • std::println()͸վߦίʔυ෇͖ • ϔομʹσϑΥϧτͷΦʔόʔϩʔυͱɺ'*-&ͷΦʔόʔ ϩʔυ͕ఆٛ͞ΕΔ • ϔομʹ͸std::ostream&ͷΦʔόʔϩʔυ͕ఆٛ͞ΕΔ • ͨͩ͠ɺstd::cerrͱ͔͸Ͱఆٛ͞ΕΔͷͰ஫ҙ println("{} {} {}", 3, 1.23, "hello"); println("{0} {0:#x} {1}", 15, "hello"); 3 1.23 hello 15 0xf hello

Slide 10

Slide 10 text

$JNQPSUTUE • ඪ४Ϟδϡʔϧͱͯ͠ɺstdͱstd.compat͕ೖͬͨ • std͸ɺ$ޓ׵ϥΠϒϥϦΛؚΉશ෦ೖΓͰɺશ෦TUE໊લۭؒʹೖΔ • std.compat͸ɺ$ޓ׵ϥΠϒϥϦΛάϩʔόϧ໊લۭؒʹ΋ೖΕΔ • ͲͪΒ΋શ෦ೖΓ • ͨͩ͠ɺϚΫϩ͸ؚ·Εͳ͍ͷͰassertͱ͔͕ඞཁͳΒΠϯΫϧʔυ͕ ௥ՃͰඞཁ import std; int main() { std::println("Hello World"); }

Slide 11

Slide 11 text

$FYQFDUFE • ਖ਼ৗ஋͔Τϥʔ஋ͲͪΒ͔͕ೖΔܕͱͯ͠TUEFYQFDUFE͕ೖΔ • FYQFDUFEJOU TUSJOHͩͬͨΒਖ਼ৗ஋JOUɺΤϥʔ஋TUSJOH • FYQFDUFETUSJOH TUSJOH΋Ͱ͖Δ expected safe_divide(double i, double j) { if (j == 0) { return unexpected("divide by zero"); } else { return i / j; } } if (auto r = safe_divide(3.0, 2.0); r.has_value()) { r.value(); // 正常値を取り出してなにかする } else { r.error(); // エラー値を取り出してなにかする }

Slide 12

Slide 12 text

$HFOFSBUPS • $ͷίϧʔνϯΛΑΓ͔ΜͨΜʹ࢖͑Δػೳͱͯ͠TUEHFOFSBUPS5 Ϋϥε͕ೖͬͨ • ੜ੒ͨ͠஋Λ3BOHFͱͯ͠࢖͑Δ // 偶数値の無限Rangeを作る関数 std::generator evens() { int n = 0; while (true) { co_yield n; n += 2; } } // 先頭5個だけ使う for (int i : evens() | std::views::take(5)) {}

Slide 13

Slide 13 text

·ͱΊ • $ͱ$ͰɺීஈͷϓϩάϥϛϯάΛΑΓ؆୯ʹ͢Δ ػೳ͕ͨ͘͞ΜೖΓ·ͨ͠ • $ͷΞοϓσʔτʹ͍͍͚ͭͯͳ͘ͳΔํ΋૿͑ͯ͘Δͱ ࢥ͏ͷͰɺ৘ใൃ৴͕Μ͹Γ·ͬ͢

Slide 14

Slide 14 text

εϙϯαʔืूத • IUUQTDQQSFGKQHJUIVCJP • $೔ຊޠϦϑΝϨϯεαΠτDQQSFGKQͷεϙϯαʔืूΛ ։࢝͠·ͨ͠ • $ͷ࠷৽৘ใΛ࣋ଓతʹൃ৴͍ͯͨ͘͠Ίʹαϙʔτ͍ͯ͠ ͚ͨͩΔํΛืू͓ͯ͠Γ·͢ • ͍͍͓ͨͩͨۚ͸ɺฤूऀʹ෼഑͠·͢