C++

今時の C++ で連想配列を扱う

C++

今時と書いたんですがあんまり今時の C++ は知らないのでもっといい書き方ってありますかね? 元ネタ:いろいろな言語の連想配列系リテラル記法を比較してみた|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社 C++ の例が載って…

C++20 で指示付き初期化子を使ったキーワード引数

C++20 で指示付き初期化子が実装されました。 指示付き初期化子はクラスを初期化する時に『任意のメンバ変数』を指定して初期化する事ができます。 struct pos{ int x; int y; int z; }; // .メンバ変数名 = で初期化できる pos p{ .x = 1, .y = 2, .z = 3 }…

【一人 C++20 Advent Calendar 2019】C++ にコンセプトがやってくる!【25日目】

一人 C++20 Advent Calendar 2019 25日目の記事になります。 C++ にコンセプトがやってくる! ついに C++ にコンセプトがやってきました! C++11 の時代から長かった…。 コンセプトとはテンプレートパラメータに対して任意の制約を指定することができるよう…

【一人 C++20 Advent Calendar 2019】状態を持たないラムダ式がデフォルト構築可能、代入可能となった【24日目】

一人 C++20 Advent Calendar 2019 24日目の記事になります。 状態を持たないラムダ式がデフォルト構築可能、代入可能となった 状態を持たないラムダ式がデフォルト構築可能、代入可能となりました。 次のようにラムダ式の型からオブジェクトを定義することが…

【一人 C++20 Advent Calendar 2019】C++ にモジュールがやってくる!【23日目】

一人 C++20 Advent Calendar 2019 23日目の記事になります。 C++ にモジュールがやってくる! ついに C++ にモジュールがやってきます! モジュールとはヘッダーファイル・インクルードに置き換わる『外部ファイル・実装を取り込む新しい仕組み』になります…

【一人 C++20 Advent Calendar 2019】実装依存の情報をまとめた <version> ヘッダーを追加【22日目】

一人 C++20 Advent Calendar 2019 22日目の記事になります。 実装依存の情報をまとめた ヘッダーを追加 実装依存の情報(実装固有のライブラリバージョンマクロなど)をまとめたヘッダーとして <version> が追加されます。 今まではライブラリごとのヘッダーをインクル</version>…

【一人 C++20 Advent Calendar 2019】範囲ライブラリとして <ranges> が追加される【21日目】

一人 C++20 Advent Calendar 2019 21日目の記事になります。 今回もまだ実装しているコンパイラがないので軽めの内容です。 [範囲ライブラリとして が追加される] 今まではイテレータの組を利用してイテレーションを行っていたのですが、C++20 では新しく <ranges> </ranges>…

【一人 C++20 Advent Calendar 2019】std::result_of が削除される【20日目】

一人 C++20 Advent Calendar 2019 20日目の記事になります。 std::result_of が削除される C++11 で追加され、C++17 で非推奨になっていた std::result_of が削除されます。 変わりに今後は std::invoke_result を使用する事が推奨されます。 #include <type_traits> stru</type_traits>…

【一人 C++20 Advent Calendar 2019】新しいフォーマットライブラリ <format> が追加【19日目】

一人 C++20 Advent Calendar 2019 19日目の記事になります。 新しいフォーマットライブラリ が追加 printf のようなフォーマットを指定して文字列を生成するライブラリが新しく追加されます。 例えば std::format(書式, 引数...) のような形で呼び出し、関数…

【一人 C++20 Advent Calendar 2019】<=> 演算子が追加される【18日目】

一人 C++20 Advent Calendar 2019 18日目の記事になります。 <=> 演算子が追加 C++20 では新しく三方比較演算子(<=>) が追加されます。 宇宙船演算子とも言われてるやつですね。 <=> 演算子は 自分と等しい 自分よりも大きい 自分よりも小さい の 3つの状態…

【一人 C++20 Advent Calendar 2019】typeid が constexpr に対応【17日目】

一人 C++20 Advent Calendar 2019 17日目の記事になります。 typeid が constexpr に対応 昨日書いた dynamic_cast が constexpr に対応したのに合わせて type_id も constexpr に対応しました。 #include <typeinfo> #include <iostream> struct A { virtual void dummy() {} };</iostream></typeinfo>…

【一人 C++20 Advent Calendar 2019】dynamic_cast が constexpr に対応【16日目】

一人 C++20 Advent Calendar 2019 16日目の記事になります。 dynamic_cast が constexpr に対応 dynamic_cast が constexpr に対応しました。 #include <iostream> struct A { virtual void dummy(){} }; struct B : A { constexpr B(int value) : value(value) {} vir</iostream>…

【一人 C++20 Advent Calendar 2019】constinit 指定子を追加【15日目】

一人 C++20 Advent Calendar 2019 15日目の記事になります。 constinit 指定子を追加 constinit 指定子を使用すると初期化のみをコンパイル時に処理されることを保証することが出来ます。 constinit 指定子は静的またはスレッド記憶域期間を持つ変数に対して…

【一人 C++20 Advent Calendar 2019】consteval 指定子を追加【14日目】

一人 C++20 Advent Calendar 2019 14日目の記事になります。 consteval 指定子を追加 consteval とは即時関数を示す為の指定子です。 即時関数とはその関数の呼び出しがコンパイル時定数式を生成しなければならないことを指します。 // コンパイル時に定数を…

【一人 C++20 Advent Calendar 2019】ソースコードの位置情報を返すライブラリを追加【13日目】

一人 C++20 Advent Calendar 2019 13日目の記事になります。 ※まだこの機能を実装しているコンパイラがなかったので概念の説明になります。 ソースコードの位置情報を返すライブラリを追加 ソースコードの位置情報を扱うための <source_location> ライブラリが新しく追加され</source_location>…

【一人 C++20 Advent Calendar 2019】連想コンテナにある要素が含まれているかを判定するメンバ関数を追加【12日目】

一人 C++20 Advent Calendar 2019 12日目の記事になります。 連想コンテナにある要素が含まれているかを判定するメンバ関数を追加 std::map などの連想コンテナにある要素が含まれているかどうかを判定する contains() メンバ関数が追加されました。 #includ…

【一人 C++20 Advent Calendar 2019】コンパイル時に評価されたかどうかを判別出来る関数を追加【11日目】

一人 C++20 Advent Calendar 2019 11日目の記事になります。 コンパイル時に評価されたかどうかを判別出来る関数を追加 コンパイル時に評価されたかどうかを判別出来る std::is_constant_evaluated() 関数が追加されました。 この関数はコンパイル時に評価さ…

【一人 C++20 Advent Calendar 2019】文字列の先頭や末尾に対して任意の文字列が一致するか判定するメンバ関数の追加【10日目】

一人 C++20 Advent Calendar 2019 10日目の記事になります。 文字列の先頭や末尾に対して任意の文字列が一致するか判定するメンバ関数の追加 std::basic_string と std::basic_string_view に starts_with() と ends_with() のメンバ関数が追加されます。 #i…

【一人 C++20 Advent Calendar 2019】ジェネリックラムダのテンプレート構文【9日目】

一人 C++20 Advent Calendar 2019 9日目の記事になります。 ジェネリックラムダのテンプレート構文 C++20 ではジェネリックラムダ式でテンプレート構文を書けるようになりました。 書き方は以下の通り。 #include <iostream> #include <vector> int main(){ // std::vector の</vector></iostream>…

【一人 C++20 Advent Calendar 2019】指示付き初期化【7日目】

一人 C++20 Advent Calendar 2019 8日目の記事になります。 指示付き初期化 C++20 では {} で初期化する場合に任意のメンバ変数を指定して初期化する事が出来ます。 #include <iostream> #include <string> struct user{ int id = -1; std::string name; int age; }; int main(</string></iostream>…

【一人 C++20 Advent Calendar 2019】autoパラメータによる関数テンプレートの簡易定義【7日目】

一人 C++20 Advent Calendar 2019 7日目の記事になります。 autoパラメータによる関数テンプレートの簡易定義 C++ 14 で実装されたジェネリックラムダでは引数型として auto が使えました。 auto plus = [](auto a, auto b) { return a + b; }; plus(1, 2); …

【一人 C++20 Advent Calendar 2019】定数式からの仮想関数の呼び出しを許可【6日目】

一人 C++20 Advent Calendar 2019 6日目の記事になります。 定数式からの仮想関数の呼び出しを許可 定数式での仮想関数呼び出しが可能になりました。なりました! struct X { virtual int value() const = 0; }; constexpr int twice(X const& x) { // 参照…

【一人 C++20 Advent Calendar 2019】型名であることが明らかな文脈で typename を省略可能になる【5日目】

一人 C++20 Advent Calendar 2019 5日目の記事になります。 型名であることが明らかな文脈で typename を省略可能になる C++ では依存名を解決する為に以下のようなケースで typename を付ける必要がありました。 template<typename T> typename T::value_type const& fi</typename>…

【一人 C++20 Advent Calendar 2019】friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可【4日目】

一人 C++20 Advent Calendar 2019 4日目の記事になります。 friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 C++17 では以下のように friend した関数内で構造化束縛を経由して private なメンバ変数にアクセスす…

【一人 C++20 Advent Calendar 2019】範囲 for 文がカスタマイゼーションポイントを見つけるルールを緩和【3日目】

一人 C++20 Advent Calendar 2019 3日目の記事になります。 範囲 for 文がカスタマイゼーションポイントを見つけるルールを緩和 C++17 までは範囲 for で begin / end を参照する場合に以下のような挙動になっていました。 begin() / end() 両方のメンバ関数…

【一人 C++20 Advent Calendar 2019】初期化式をともなう範囲 for 文【2日目】

一人 C++20 Advent Calendar 2019 2日目の記事になります。 初期化式をともなう範囲 for 文 範囲 for 文を記述する際に次のように初期化式を含めることが出来るようになりました。 C++20 以前 { // for 文の外で初期化する必要があった T thing = f(); for (…

【一人 C++20 Advent Calendar 2019】C++20 のコンパイラのサポート状況【1日目】

一人 C++20 Advent Calendar 2019 1日目の記事になります。 一人 C++20 Advent Calendar 2019 とは 最近の C++ 事情を全く把握していないのでリハビリがてらダラダラを C++20 関連の事を書いていこうかなーと思い Advent Calendar をつくりました。 主に C++…

C++ で std::tuple を使ってバージョン番号を比較する

C++

元ネタ:C++ バージョン番号を比較する方法 - イネマルのプログラミング備忘録 #include <tuple> #include <iostream> int main(){ // 適当なバージョンデータ auto appA = std::tuple{ 2, 0, 101, 2 }; auto appB = std::tuple{ 2, 0, 100, 3 }; // C++11 で使いたいなら std</iostream></tuple>…

C++ の std::tuple で動的にループする

C++

たまに C++ を書かないと忘れるので…。 [コード] #include <tuple> #include <iostream> #include <string> template<typename F, typename T, std::size_t I> void apply_impl(F f, T const& t){ f(std::get<I>(t)); } template<typename F, typename T, std::size_t ...Indices> void apply_impl(F f, T const& t, std::size_t n, std::inde…</typename></i></typename></string></iostream></tuple>

C++ で each_split

C++

C++ で split というと『戻り値型とかどうするの』みたいな問題があるんですが、『それなら戻り値ではなくて each みたいに関数オブジェクトを渡せばいいじゃん』みたいな感じでやってみた。 #include <iostream> #include <sstream> #include <string> auto each_split = [](auto src, </string></sstream></iostream>…