C++ソフトウェア設計 読書会vol.31
https://scrapbox.io/files/677e58cd6851aa4933a854f0.jpeg
#C++ソフトウェア設計
開催日時
2026年6月3日(水) 21:00~22:30
開催URL
https://cpp-osaka.connpass.com/event/395499/
参加人数
4人
読み進め方
ウォーミングアップ
ガイドライン 26:型を静的に区別するには CRTP パターン
暗号めいた略語
顧みることも修正されることもなく放置されている命名
それってわかりにくい命名のままで伝わるものも伝わらないのでは?
DynamicVector
これってstd::vectorそのままと何が変わるの?
何かしら機能制限をしたかった?
DenseVectorでテンプレート引数化
これだとVector以外何でも入れれてしまう
汎用性上げすぎ
じゃあDenseVectorを基底クラスにする
それだと仮想関数コールの嵐で実行コストが上がってしまう
解明 CRTP パターン
virtualを付けたくないあなたへ
Core Guide­line C.35
なんでprotectedな非仮想関数とすべきなの?
privateだとそもそも派生で呼べない
protectedだとunique_ptr<Base> p = make_unique<D>();と書いたときpの寿命が尽きた際にデストラクタを呼び出そうとしてコンパイルエラーにできる
interface的なことを実現したい。仮想関数のコストを払わずに。
CRTP:「バーチャル付けずにインタフェース作れるやつ」
この命名を広める運動しよう
コストはゼロかもしれないけれど、読解コストが高くなる
ベクトルの零元
インタフェースとして添え字演算できないので破綻しているような
MSVCはコンパイル時にやっててGCC/Clangとタイミングが違った
MSVCの思想
MSVCオプションでタイミングを変えれた
コールされたときに初めてインスタンス化される
コンパイル時にコールするものを見つけた時点でインスタンス化を行う
CRTP パターンの短所を分析
次回ここから
お悩み雑談室
C++ breaktimeについて
用語集
ISP
インタフェース分離の原則
ISP は SRP の特殊なケースと捉える。
SRP
単一責任の原則
OCP
開放/閉鎖原則
LSP
サブタイプ(派生クラス)が満たすべきふるまい
リスコフの置換原則 (ガイドライン6)
サブタイプでは事前条件を強化してはならない
サブタイプは事後条件を弱めてはならない
サブタイプの関数の戻り型は共変(covariance)でなければならない
サブタイプの関数パラメータは反変(contravariance)でなければならない
スーパタイプの不変条件はサブタイプでも維持されなければならない
DIP
依存関係逆転の原則(ガイドライン9)
依存関係を管理するには、具象型や実装詳細ではなく抽象化に依存すべきである