C++

クラステンプレートの組み合わせ爆発を抑える技

  • このエントリーをはてなブックマークに追加
  • Pocket

クラステンプレートの組み合わせ爆発

Class<T>

というクラスがあり、Tの特性によってメンバ関数やメンバ変数を変えたいという場合。

 

愚直に特殊化していたら必要な組み合わせの数だけクラス定義が必要になる。

実はメンバ関数はフリー関数にするべきかもしれない。

しかし、メンバ変数はどうしようもないのでなんとかするしかない。

特にコンストラクタ・代入演算子が一番むずかしい。

deleted宣言するかしないかがあるからだ。

 

Tがdefault_constructibleかどうかでコンストラクタを場合分けしたい場合、2通りのクラスがあればいい。

さらにcopy_constructibleかどうかで場合分けしたい場合、4通りのクラスが必要。

さらにmove_constructibleかどうかで場合分けしたい場合、8通りのクラスが必要。

もうこのあたりからやる気がなくなる。

実際、これに加えてまだ

constructorがexplicit指定されているかとかで場合分けが必要になって16通を超えて

copy_assignable、move_assignable……

ここまでくるとこの世の終わりのような気分になる。

 

そこで継承ですよ

この問題を力技を使わずに解決するためには継承を使う。

テンプレートの特殊化を用意し、多重継承するか、または継承を階層にする。

それぞれの条件を個別のクラスに分割し、最終的に親がそれらをすべて継承するようにする。

自分でコード書く元気がないので風露さんが書いたコードのWandboxリンクを貼る。

そのうちちゃんと解説したい。

 

 

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください