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…