Rokiのチラ裏

学生による学習のログ

あらゆるSTLコンテナをあらゆるSTLコンテナへ一発変換する(連想配列などを除く)

range adaptorライブラリを書いていて、copiedがあるのだから、集合の種類を指定できても良いだろうと思い、実装する事にした。

以下のように使える。

auto v = boost::irange(0x41,0x47) | srook::adaptors::to_range<std::vector>(); // boost::irangeと併用可能
auto li = v | srook::adaptors::to_range<std::list>(); // リストへ
auto t1 = v | srook::adaptors::to_range<std::tuple,6>(); // タプルへ
auto str = v | srook::adaptors::to_range<std::basic_string>(); // std::stringへ
auto ar = v | srook::adaptors::to_array<std::array,6>(); // std::arrayへ
auto str1 = v | srook::adaptors::to_string<std::wstring>(); // std::wstringへ
auto str2 = v | srook::adaptors::to_string<std::u16string>(); // std::u16stringへ
auto str3 = v | srook::adaptors::to_string<std::u32string>(); // std::u32stringへ

tupleに対する特殊化がされており、再起によって元集合のデータを取り出すようにしている。このコードのみではlistとarrayに対応できていない。まあ直ぐ書けるのだが、余談を挟むと、色々とこれ以外にも作業をしていたら、執筆段階で朝の4時となってしまったので一旦休眠し、後日書くことにした。

上記の通り対応した。arrayのテンプレートパラメータを特殊化させる事は不可能なため、別途設けているが何か良い方法はないだろうか。それと、to_rangeにbasic_stringを渡して文字列を生成する事も上記の通り可能ではあるが、chatTを指定する術がないため、必ずstd::stringを返すようにしている。よってこの書き方だとwstirng,u16string,u32stringに対応できない。そのために、一応、to_stringも設ける事にした。using namesapce std;using namespace srook::adaptors;を行うとstd::to_stringと名前が被りそうな雰囲気が漂うが、オーバーロード解決により正しく呼び出される。