メモの日々


2020年02月06日(木) [長年日記]

[c++] C++17の畳み込み式(fold expression)

C++17から可変引数テンプレートに対して畳み込み式というのが使えることを知ったのでメモ。

以前に書いた可変引数テンプレートのコードを畳み込み式を使って書き直してみる。

#include <iostream>
#include <string>

// sからindexesで指定された位置の文字を繋いだ文字列を返す。
template<typename... Args>
auto select(const std::wstring& s, Args... indexes)
-> decltype(std::initializer_list<int>({indexes...}), std::wstring{})
{
  using namespace std::literals::string_literals;
  return (L""s + ... + s.at(indexes));
}

int main()
{
  std::ios_base::sync_with_stdio(false);
  std::wcout.imbue(std::locale(""));
  std::wcout << select(L"パタトクカシーー", 1, 3, 5, 7) << std::endl;
}

非常に強力。