7/1のノート c++17
江添亮の詳説C++17
気になった項目を列挙する
constexpr if
テンプレートで使う
std::is_sameと併用して型によって処理を分岐させるようにできる
if (condition) { ... //もしここを通らなくても...が実行(実体化)できないといけない } if constexpr (condition) { //ここだけ必ず実体化される ... //trueのときだけ実行できればOK }
構造化束縛
配列, std::pair, std::tuple, 構造体(staticを除きprivateデータメンバ無し)に対して使えて
auto [a, b] = make_pair("abc", 123);
for文でも使えるのが面白い
std::map<std::string, int> table = { {"abc", 123}, {"def", 456} }; for (const auto& [key, value] : table) { std::cout << key << "=>" << value << std::endl; }
variant
たくさん書いてあるので重要な感じがするが気が向いたら読む
any
なんでも入る。何に使うんだろう
apply
tupleの要素を実引数として関数を呼び出す
template <class ...Args> void f(Args... args); std::tuple t(1, 2, 3); apply(f, t); //f(1, 2, 3);
おもに可変引数テンプレートのパラメータパックを扱うために存在する?
make_from_tuple
tupleの要素を実引数としてコンストラクタを呼び出し、オブジェクトを返す
insert_or_assign
std::mapまたはunordered_mapで値を設定するとき、新規にkeyとvalueの組を作るとき(inserted)はtrue, それ以外はfalseをイテレータとともに返す
std::map<std::string, int> m = {{"abc", 123}}; auto [it, inserted] = m.insert_or_assign("abc", 456); //inserted == false