あらゆる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と名前が被りそうな雰囲気が漂うが、オーバーロード解決により正しく呼び出される。