有什么方法可以包装boost“ tee”流的构造以进行自动类型推断?

时间:2018-09-06 18:40:16

标签: c++ c++11 boost boost-iostreams

boost :: iostreams :: tee和company有点嘈杂/重复使用,如此处所示:

C++ "hello world" Boost tee example program

目标是制作类似的东西

auto myTeeStream = make_tee(std::cout, myfile);

尝试使用make_tee函数包装此用法以允许对参数进行自动类型推断时,我意识到对于必需的类型,复制和移动构造函数均不可用。

所以:是否有一种明智的方法来在c ++ 11中包装tee流创建

这是我的尝试,因为删除了副本构造函数而缺少了move构造函数,因此编译失败:

#include <iostream>
#include <ostream>
#include <fstream>

#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>

template <typename StreamT1, typename StreamT2>
boost::iostreams::stream<boost::iostreams::tee_device<StreamT1, StreamT2> >
make_tee(StreamT1 & t1, StreamT2 & t2)
{
    using boost::iostreams::stream;
    using boost::iostreams::tee;
    return stream<decltype(tee(t1,t2))>(tee(t1,t2)); // compile error
    //return std::move(stream<decltype(tee(t1,t2))>(tee(t1,t2))); // also fails of course
}


int main()
{
    {
        // desired usage
        std::ofstream myFile("file.txt");
        auto && myTee = make_tee(std::cout, myFile); // required from here
    }
    {
        // noisy default usage
        std::ofstream myFile("file.txt");
        using boost::iostreams::tee;
        using boost::iostreams::stream;
        auto && myTee = stream<decltype(tee(std::cout, myFile))>(tee(std::cout, myFile));
    }
    return 0;
}

来自clang++ --std=c++11 teetest.cpp的错误是:

teetest.cpp:14:12: error: call to implicitly-deleted copy constructor of 'boost::iostreams::stream<boost::iostreams::tee_device<basic_ostream<char>, basic_ofstream<char> > >'

1 个答案:

答案 0 :(得分:3)

在c ++ 17中使用“保证复制省略” 可以很好地进行编译。

在c ++ 11中,您可以使用return {..}

template <typename StreamT1, typename StreamT2>
boost::iostreams::stream<boost::iostreams::tee_device<StreamT1, StreamT2> >
make_tee(StreamT1 & t1, StreamT2 & t2)
{
    using boost::iostreams::stream;
    using boost::iostreams::tee;
    return {tee(t1,t2)};
}

Demo