次期C++2b(C++23)標準ライブラリに向けて、Rangesから各種コンテナ型への直接変換サポートが検討されている。(PDF)P1206R6では下記の機能追加/拡張を提案している。
2022-02-15追記:2022年2月会合でC++2b向け提案文書(PDF)P1206R7が採択された。
#include <ranges> #include <vector> bool is_prime(int n); // 100未満の素数を列挙するRange auto rng = std::views::iota(1) | std::views::filter(is_prime) | std::views::take_while([](int x) { return x < 100; }); // C++20: 一部Rangeではcommon_viewへの変換が必要 auto cv = rng | std::views::common; std::vector vec( std::begin(cv), std::end(cv) );
// C++2b(P1206R6) auto rng = /* (同上) */; // std::ranges::to<C>レンジアダプタ auto vec = std::ranges::to<std::vector>( rng ); // 関数記法 auto vec = rng | std::ranges::to<std::vector>(); // パイプライン記法 // std::from_rangeコンストラクタ std::vector vec( std::from_range, rng );
std::ranges::to<C>
レンジアダプタでは、あらゆる実現手段を用いてRange→コンテナ変換を試みる。コンパイル時に下記パターンを試行する:
1. レンジからコンテナC
を直接構築
- 2023-01-13追記:LWG3785 適用により
std::optional
などコンテナ以外への変換もサポートされる。
2. std::from_range
タグ付きコンストラクタを用いたコンテナC
構築
3. イテレータペア:std::range::begin(r)
, std::range::end(r)
からコンテナC
構築
4. 末尾への要素追加:コンテナC
構築後にRange要素を順次末尾に追加
5. 入れ子Range対応:変換先コンテナ要素が子Rangeかつ変換元Range要素も子Rangeならば、各要素(子Range)に対するstd::ranges::to
結果からコンテナC
を構築
- 例:
std::list<std::list<int>>
からstd::vector<std::vector<double>>
への一発変換など。
6. いずれの方式も利用不可ならばコンパイルエラー(ill-formed)
関連URL