日記

内容の正しさは保証しません

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