C++

【一人 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>…

【初心者C++er Advent Calendar 2017】#include <iostream> は何をやっているのか【1日目】

C++

初心者C++er Advent Calendar 2017 1日目の記事になります。 別の Advent Calendar の記事を書いていたら遅れてしまって申し訳ない。 まだ、Advent Calendar の参加者に飽きがあるので気になっている人はどんどん参加してもええんやで…。 さて、初心者ネタっ…

GCC の __PRETTY_FUNCTION__ 識別子

C++

C++11 では __func__ という識別子が追加され、関数名が文字列で取得する事が出来ます。 #include <iostream> namespace my{ template<typename T, typename U> auto plus(T a, U b){ // 現在の関数の名前を取得できる std::cout << __func__ << std::endl; return a + b; } } int main(){ std:</typename></iostream>…

C++17 で追加される std::apply 関数

C++

C++17 で std::apply という関数が新しく追加されます。 これは『タプル型を展開して関数の引数として渡す』という関数になります。 #include <tuple> #include <iostream> int main(){ auto print = [](auto id, auto name, auto age){ std::cout << "id:" << id << " name:" </iostream></tuple>…

C++ でコンストラクタの引数名をメンバ変数名と同じにする

C++

コンストラクタで引数を受け取ってメンバ変数を初期化する場合、 struct X{ X(int _value) : value(_value){} int value; }; みたいに引数名に _ prefix/suffix をつけているコードをたまに見かけます。 しかし、実は引数名はメンバ変数名と同じでも問題なく…

C++17 の構造化束縛を range-based for で使う

C++

C++17 では構造化束縛という言語機能が追加されました。 これは std::tie のように std::tuple などを個別に変数で受け取る事が出来る機能です。 auto homu = std::make_tuple(1, "homu", 14); // std::tuple の要素を個別に受け取る auto [id, name, age] =…

std::for_each の戻り値

C++

std::for_each の戻り値って void だと思っていたんですが、どうやら第三引数が返ってくるらしい。 #include <vector> #include <iostream> int main(){ std::vector<int> v{1, 2, 3, 4, 5}; std::for_each(v.begin(), v.end(), [](auto n){ std::cout << n << std::endl; })(42); s</int></iostream></vector>…

Boost 1.65.0 がリリース

C++

Boost 1.65.0 がリリースされました。 Boost 1.65.0 では以下の2つのライブラリが新しく追加されました。 Boost.PolyCollection Boost.Stacktrace Boost.PolyCollection は抽象クラスに特化したコンテナで、Boost.TypeErasure などとも連携して使うことが出…

C++ で std::getline を使った split

C++

前回、std::regex を使った split を実装しましたが、今回は std::getline を使った実装です。 #include <iostream> #include <sstream> #include <vector> #include <string> int main(){ auto split = [](auto src, auto del){ std::istringstream stream{src}; std::string output; std::vect</string></vector></sstream></iostream>…

C++ で std::regex を使った split

C++

C++ で split が話題になっていたのでやってみた。 #include <regex> #include <iostream> #include <string> #include <vector> int main(){ auto split = [](std::string src, auto pat){ std::vector<std::string> result{}; std::regex reg{pat}; std::copy( std::sregex_token_iterator{src.begin(), s</std::string></vector></string></iostream></regex>…

C++17 で追加された std::conjunction/std::disjunction メタ関数

C++

知らなかったので覚書。 C++17 で std::conjunction と std::disjunction という2つのメタ関数が追加されました。 この2つのメタ関数はいずれも可変長テンプレート引数を受け取ります。 具体的にどのようなメタ関数なのかは以下のコードを見てください。 #in…

C++ のラムダ式を型推論しながら関数ポインタ型で受け取る

C++

ほぼ使うことはないだろうけど、かなりの知見だったので覚書。 ラムダ式を関数ポインタ型へ変換する これは割と一般的な知識だと思うんですが、『キャプチャしていない』ラムダ式は関数ポインタ型へとキャストする事が出来ます。 using func_t = int(*)(int)…

C++ でライフゲームを書いてみた

C++

特に意味はないんですが、C++ でライフゲームを書いてみました。 C++14 で動作します(Windows での動作は未確認。 [コード] #include <cstdlib> #include <thread> #include <string> #include <iostream> #include <vector> int main(){ using table_t = std::vector<std::vector<bool>>; table_t table = { { 0, 0, 0, 0</std::vector<bool></vector></iostream></string></thread></cstdlib>…

C++14(17) で zip 書いてみた

C++

現状の C++ で zip を書いたらどうなるんだろう、と思って書いてみました。 [コード] #include <iostream> #include <algorithm> #include <vector> #include <tuple> template<typename T, typename U> constexpr auto zip_impl(T v1, U v2){ auto vi1 = std::begin(v1); auto vi2 = std::begin(v2); using value_t = dec</typename></tuple></vector></algorithm></iostream>…

C++17 のクラステンプレートのテンプレート引数推論を使ってみて

C++

C++17 では『クラステンプレートのテンプレート引数推論』という機能が新しく追加されました。 どういう機能かというと C++17 以前では以下のようなクラステンプレートを使用する場合はテンプレート引数を明示化する必要がありました。 template<typename T> struct A{ A</typename>…

C++ で Non-static data member initializers に auto が使えないのがつらい

C++

C++14(17) になっても Non-static data member initializers に auto が使えないのがつらい、という話です。 [Non-static data member initializers とは] Non-static data member initializers とは C++11 から追加された言語機能の一つで クラスのメンバ変…