Rokiのチラ裏

学生による学習のログ

ostream_joiner

こんな便利なものがあったとは...。

#include<boost/range/algorithm_ext/iota.hpp>
#include<boost/range/algorithm/copy.hpp>
#include<array>
#include<experimental/iterator>
#include<iostream>

int main()
{
    std::array<int,5> ar;
    boost::iota(ar,0);
    boost::copy(ar,std::experimental::make_ostream_joiner(std::cout,",")); // output:0,1,2,3,4
}

これがあれば、私が製作したmake_elements_stringの殆どの内部インプリメントを任せる事ができる。

#include<boost/range/algorithm_ext/iota.hpp>
#include<boost/range/algorithm/copy.hpp>
#include<utility>
#include<experimental/iterator>
#include<sstream>
#include<array>

template<class Container,char _delimiter=' '>
constexpr std::string make_elements_string(Container&& c)
{
    std::stringstream ss;
    boost::copy(std::forward<Container>(c),std::experimental::make_ostream_joiner(ss,_delimiter));
    return ss.str();
}

int main()
{
    std::array<int,5> ar;
    boost::iota(ar,0);
    auto str=make_elements_string(std::move(ar));
}

これは...どうにかsrookライブラリにも取り入れたいところだが、experimental namespace内にあるので、その間はまだこの機能に依存したくもない気がしている。

追記

結局、マクロで取り敢えず、最低限の対応をしてみる事とした。
make elements string · falgon/SrookCppLibraries@31fa611 · GitHub

参照