C++

structured bindings(構造化束縛)を自作クラスで行えるようにする

はじめに structured bindings (構造化束縛) をstd::pair<>やstd::tuple<>以外の自作のクラスに対して適用するための方法をコード例込みで解説している日本語の記事が見つからなかったのでメモを兼ねて残しておきます。 結論 std::tuple_size<T>を特殊化する st</t>…

MSVCでempty base optimizationの効かないパターンと対策

問題 2つ以上の空クラスを継承するようなクラスについて、MSVCで empty base optimization (EBO) が期待した通りに働かず、余分な領域が消費される。 struct Empty1 {}; struct Empty2 {}; // 1つの空クラスを基底に持つ struct Derived1 : Empty1 { int i; …

最近プリプロセス時処理が楽しい

はじめに Boost.Preprocessorの実装を調べているうちに色々出来ることが分かって楽しくなってきた。基本的なことから曲芸的なことまで適当にパターンをメモっておきます。 シンボルの結合 #define PP_CAT(a, b) PP_CAT_I(a, b) #define PP_CAT_I(a, b) a ## …

C++17 optionalの実装について

C++17で、optionalが標準ライブラリに入ることが決定した。そして、C++17 optionalはconstexprに対応している。以前からその実装について気になっていたので調べたついでに少しまとめる。 optionalとは 無効値を取ることのできる型である。C++17 optionalはB…

コンマ

ふと不思議に思ったものがあった。 線形代数ライブラリEigenの行列、ベクトルの初期化方法だ。 Eigen::Vector3d v; v << 1.0, 2.0, 3.0; v; // (1, 2, 3) なんだか妙なことをしている。 どのようなしくみになっているのかを確かめるために実装を調べた。どう…

このコードにはバグがある

今日はこのようなツイートを見た。バグが入ったC++コードらしい。#CEDEC2015 pic.twitter.com/ca9vb0emVT— alwei (@aizen76) 2015, 8月 26 #include <stdio.h> class base_class { public: base_class() { x = 0; y = 0; } public: int x; int y; }; class derived_cl</stdio.h>…

文字列型をキーとしたunordered_map

プログラミングをしている際、文字列型をキーとした連想配列を扱いたい時がある。そのような時に用いられるのは多くの場合unordered_mapだ。 using Map = unordered_map<string, int>; Map m = { { "a", 1 }, { "b", 2 }, { "c", 3 }, }; m["a"]; // 1 m["b"]; // 2 とこ</string,>…