複数のファイルを1つの Range として扱いたい
PStade.Oven とかを使って下記のようなコードになりました。
[ソース]
#define BOOST_RESULT_OF_USE_DECLTYPE #include <iostream> #include <string> #include <vector> #include <fstream> #include <iterator> #include <boost/range/adaptor/transformed.hpp> #include <pstade/oven/concatenated.hpp> #include <pstade/oven/copied.hpp> int main(){ namespace a = boost::adaptors; namespace o = pstade::oven; std::vector<std::string> filenames; filenames.push_back("file1.txt"); filenames.push_back("file2.txt"); std::vector<std::string> files = filenames |a::transformed([](std::string const& filename){ return std::string( std::istreambuf_iterator<char>(std::ifstream(filename)), std::istreambuf_iterator<char>() ); }) |o::copied; std::string source = static_cast<std::string const&>( files|o::concatenated|o::copied ); std::cout << source << std::endl; return 0; }
std::vector に一度コピーしているのがダサいのでどうにかしたいんですが、ぐぬぬ。
もっとスマートに書けないかしら…。