C++ソフトウェア設計 読書会vol.16
https://scrapbox.io/files/677e58cd6851aa4933a854f0.jpeg
開催日時
2025年9月3日(水) 21:00~22:30
開催URL
参加人数
6人
ウォーミングアップ
CとC++の演算優先
新人さんから質問された内容
CとC++で三項条件演算子の結合優先が変わるのはなぜですか?
私「えっ・・・?」
code: cpp
int main()
{
int a = 1;
int b = 2;
int c = 1 ? a : b = 3;
printf("a:%d\n", a);
printf("b:%d\n", b);
printf("c:%d\n", c);
}
a,b,cがどういう値になるかわかります?
C++
C
加えて微妙に条件演算子がC++では左辺値を返すように変わっていそう
PHPの条件演算子はバージョンによって結合順が変化した
こわっ
用語集
ISP
インタフェース分離の原則
ISP は SRP の特殊なケースと捉える。
SRP
単一責任の原則
OCP
開放/閉鎖原則
LSP
サブタイプ(派生クラス)が満たすべきふるまい
リスコフの置換原則 (ガイドライン6)
サブタイプでは事前条件を強化してはならない
サブタイプは事後条件を弱めてはならない
サブタイプの関数の戻り型は共変(covariance)でなければならない
サブタイプの関数パラメータは反変(contravariance)でなければならない
スーパタイプの不変条件はサブタイプでも維持されなければならない
DIP
依存関係逆転の原則(ガイドライン9)
依存関係を管理するには、具象型や実装詳細ではなく抽象化に依存すべきである
ガイドライン13:デザインパターンはどこにもある
monotonic_buffer_resourceの例
これallocaと同じことをしてるのか
スタックのメモリを使用する
_allocaが非推奨になってて_mallocaを使うように言われてる
_mallocaは場合によってヒープから確保するので_freeaが必要
memory_resourceの例
privateな純粋仮想関数。そんなものもあるのか
privateだから派生先からは呼び出せないけれどoverrideはできる
memory_resourceクラスからdo_~関数がおそらく呼び出される
[[nodiscard]]属性
ここからいろんなC++アトリビュートを見ていった
[[assume]] (C++23から)
これアサートマクロを作って実行時に[[assume]]に置き換えたらいいんじゃない
↑天才
だからデザインパターンはオワコンじゃないよ、と言いたい著者
ちょっとこじつけ感
オワコンじゃないとは思うけれど取り立てて言うほどでもない
map, reduceの例
知ってる人と知らない人で生産性が違う
技術者間で「○○パターン」というだけで意思疎通ができるのが大きい
AIとのやり取りをする際にも名称を覚えているとやり取りしやすい
std::pmr::polymorphic_allocator
従来のstd::basic_stringやstd::vectorのアロケータインタフェースをつなぐ役割
ガイドライン14:デザインパターン名を用い目的を伝える
次回ここから
お悩み雑談室
PDFをWebPにラスタライズ化してる
printf("%-36s", fontName ? fontName->c_str() : "[none]");
めっちゃ長いフォント名が来た時に表示が崩れる
どんな長さでも問題ないようにjsonを用いて可変長にしたい
ヘッダオンリー
今使っているライブラリ
いいJSONライブラリないですか?
色々な脱線話