C++

C++17 クラステンプレートの実引数推論

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

C++17 テクニック #6

tl;dr

C++17からはクラステンプレートも

関数テンプレートと同様に引数からテンプレートが推論される。

How to use

初期化子がある場合、X<int>などと書く必要がなくなる。

関数テンプレートと同様の推論が働く。

C++14までは関数テンプレートで推論してクラスを作る。

いわゆる「make関数」を経由していたが。

C++17からは必要がなくなる。

例えばラムダ式を無名再帰する場合。

推論ガイド

コンストラクタの実引数がテンプレート引数と一致しない場合でも、

推論することができるためのガイド。

文法は

template < テンプレート引数宣言 >

テンプレート名( 引数リスト )-> テンプレートid;

である。

例えば、std::vectorをイテレータから構築する場合は、

次のような推論ガイドを用いる。

 

おまけ

コンストラクタがあると、型変換が可能だ。

X(T) というコンストラクタがあるとき、TはXに変換できる。

コンストラクタを持たないクラスでは(scalar-typeじゃないと)できないはず。

つまり、先程のFixedをアグリゲートにすると、初期化代入ができなくなる。

{}で囲って初期化子とするか、明示的なコンストラクタの呼び出しは可能。

 

 

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

コメントを残す

*