Upgrade to Pro — share decks privately, control downloads, hide ads and more …

明日から使える fold expression テクニック

明日から使える fold expression テクニック

歌舞伎座.tech 番外編「江添亮の詳説C++17」出版記念で発表したLTの資料

白山風露

March 14, 2018
Tweet

Other Decks in Programming

Transcript

  1. 明日から使えるの? • GCC => 6 • Clang => 3.6 •

    MSVC => 19.12 (Visual Studio 15.5) http://en.cppreference.com/w/cpp/compiler_support 調べ →明日から使える!
  2. Fold expression の文法 Unary fold expression 長さnのパラメーターパックのk番目の項を含む式をexp k として、 exp

    1 @ (exp 2 @ (... @ (exp n-2 @ exp n-1 ))) // (1) (((exp 1 @ exp 2 ) @ ...) @ exp n-2 ) @ exp n-1 // (2) と展開される。
  3. Fold expression の文法 Unary fold expression パラメーターパックが空のとき、以下の演算子に関してはデフォルトの値が存在する。 • && →

    true • || → false • , → void() それ以外の演算子の場合、パラメーターパックが空だとエラーになる。
  4. Fold expression の文法 Binary fold expression “exp” がパラメーターパックを含む式、 ”init” を任意の式、”@”

    を何らかの二項演算子として、 (exp @ ... @ init) // (1) (init @ ... @ exp) // (2)
  5. Fold expression の文法 Binary fold expression 長さnのパラメーターパックのk番目の項を含む式をexp k として、 exp

    1 @ (exp 2 @ (... @ (exp n-2 @ (exp n-1 @ init)))) // (1) ((((init @ exp 1 ) @ exp 2 ) @ ...) @ exp n-2 ) @ exp n-1 // (2) と展開される。
  6. template<typename T, typename ...Args> inline constexpr auto type_index_of = []{

    std::size_t i = 0; ((!std::is_same_v<T, Args> && ++i) && ...); return i; }(); 3.先頭から一致する型の位置を探す
  7. template<typename T, std::size_t index, typename ...Args> inline constexpr auto type_index_of

    = []{ std::size_t i = 0; (((i < index || !std::is_same_v<T, Args>) && ++i) && ...); return i; }(); 4.途中から一致する型の位置を探す
  8. inline constexpr auto call = [](auto&& func, auto&& ...args) {

    (void(func(std::forward<decltype(args)>(args))), ...); }; 5.全ての値に関して関数を呼び出す