C++

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 から追加された言語機能の一つで クラスのメンバ変…

C++ で関数引数の評価順序を保証したかった

C++

[関数引数の評価順序] C++では関数を呼び出す際に渡される引数の評価順序は未規定になっています。 どういうことかというと次のようなコードの場合、処理系によって出力される値が異なる可能性があります。 template<typename T> auto print(T value){ std::cout << valu</typename>…

C++ の可変引数リストに non trivial な値を渡すとコンパイルエラーになる

C++

以下のようなコードを Clang でコンパイルしたところエラーになりました。 [](...){}(std::string("homu")); // error: cannot pass object of non-trivial type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') through variadic method; call will abort</char></char,>…

C++17 の std::optional に無効値を設定する

C++

C++17 では Boost.Optional が新しく標準ライブラリ入りしました。 Boost.Optional で無効値を指定する場合は boost::none を使っていたんですが、標準ライブラリの std::optional では std::nullopt を使用して無効値を指定します。 [ソースコード] #includ…

void でキャストすることで "unused" の警告を回避する

元々は C言語?で使われているようなハックらしいのですが、知らなかったので覚書。 さて、例えば次のように関数の引数を assert チェックしてる関数があるとします。 void func(int value){ assert(value == 42); } この場合、デバッグビルドでは問題ないん…

【初心者C++er Advent Calendar 2016 21日目】C++ でプリプロセスマクロを使う場面

C++

初心者C++er Advent Calendar 2016 21日目の記事です。 さて、巷ではマクロを使用したコードを公開すると『static const を使え』や『typedef しろ』、『関数テンプレートでおk』などと斧が飛んでくる突っ込まれることが多いです。 これは C++ では『基本的…

【初心者C++er Advent Calendar 2016 20日目】関数テンプレートの呼び出しに優先順位をつける

C++

初心者C++er Advent Calendar 2016 20日目の記事です。 クリスマスが終わって『もはや Advent Calendar とは…』となってるんですが、まあ埋まってないより埋まってるほうがいいかなーと。 今回は初心者向けかどうか怪しい内容ですが、ちょっとしたハックでも…

【初心者C++er Advent Calendar 2016 19日目】C++ で楽しいメタプログラミングをしよう

C++

初心者C++er Advent Calendar 2016 19日目の記事です。 クリスマスから少し過ぎてしまいましたが、最後に楽しくメタプログラミングしてみる記事でも。 初心者C++er Advent Calendar 2016 が全部うまるといいですね。 [メタプログラミングとは] メタプログラ…

【初心者C++er Advent Calendar 2016 17日目】C++ で型と値を理解する

C++

初心者C++er Advent Calendar 2016 17日目の記事です。 初心者ネタに型と値の話でも。 [値とは] C++ における値とは数値や文字列、クラスのインスタンスなどを指します。 // 数値や小数 42 3.14f // 文字や文字列 'c' "homu" // クラスのインスタンス std::s…

【初心者C++er Advent Calendar 2016 11日目】C++ で型によるコンパイル時条件分岐技法まとめ

C++

初心者C++er Advent Calendar 2016 11日目の記事です。 空いてるようなのでまた書きました。 さて、初心者用ということで型を使用した『コンパイル時条件分岐技法』を簡単に紹介してみます。 [注意] 本記事では C++11 で動作することを想定してるコードにな…

【C++ Advent Calendar 2016 13日目】C++ で楽しく Expression Templates しよう

C++

C++ Advent Calendar 2016 13日目の記事です。 13日目が空いてるようなのでちょっと Expression Templates というマニアックなネタでも。 まあ C++ プロの方なら Expression Templates なんて余裕ですよね。 [注意] 本記事のコードは基本的には C++14 に準じ…

【C++ Advent Calendar 2016 22日目】C++ で enable_if を使うコードのベストプラクティス

C++

[追記] @pink_bangbi typename std::enable_if<..., std::nullptr_t>::type* = nullptr の * は余計ではありませんか。これだと nullptr_t にする意味が— akinomyoga (@akinomyoga) 2016年12月22日 すみませんすみません、修正しました。 [本編] C++ Advent …

【初心者C++er Advent Calendar 2016 13日目】予約済み識別子に注意しよう

C++

初心者C++er Advent Calendar 2016の13日目が空いてるようなの書きました。 本記事は初心者C++er Advent Calendar 201613日目の記事になります。 初心者C++er Advent Calendar 2016では 3回目の記事になりますが、今回は予約済み識別子の話です。 [予約済み…

【初心者C++er Advent Calendar 2016 8日目】関数テンプレートと関数オブジェクト

C++

タイトルは釣りです。 初心者C++er Advent Calendar 2016 8日目の記事になります。 8日が空いていたので簡単なものを書きます。 前回の記事を書いたあとに (省略されたtemplateのが気になった)— Sd2E 002/100 (@chiwawa_star) 2016年12月6日 と、言われたの…

【初心者C++er Advent Calendar 2016 3日目】C++ で型推論(auto)しよう

C++

初心者C++er Advent Calendar 2016 3日目の記事です。 3日目が空いてるようなので書いてみました。 今回は初心者向けの Advent Calendar ということで軽めの記事になります。 また、本記事では C++14 を基準としたコードになります。 [C++ で型を書く場面] …

Boost 1.62.0 がリリース

C++

最近はあまり Boost も触っていないが Boost 1.62.0 がリリースされたらしい。 今回は新しく以下の2つのライブラリが追加された。 Fiber QVM 両方共、昔から提案はされていたもののなかなか組み込まれなかったので、今回追加されたのは感情深い。

C++ の range-based for 内で iterator を進めたい

C++

通常 range-based for を使用する場合は iterator ではなくて実体を参照するのでユーザから iterator の操作を行うことは出来ません。 ので、range-based for 内でも間接的に iterator を操作できるようなラッパーを書いてみました。 [コード] #include <vector> #in</vector>…