複数のファイルを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 に一度コピーしているのがダサいのでどうにかしたいんですが、ぐぬぬ
もっとスマートに書けないかしら…。