Есть ли способ обернуть конструкцию форсированного "тройника" для автоматического вывода типа? - PullRequest
0 голосов
/ 06 сентября 2018

boost :: iostreams :: tee и company имеют немного шумное / повторное использование, как показано здесь:

C ++ "hello world" Пример программы повышения уровня

Цель состоит в том, чтобы сделать что-то вроде:

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

После попытки обернуть это использование функцией make_tee для автоматического вывода типов из аргументов, я понял, что конструкторы копирования и перемещения недоступны для необходимых типов.

Итак: Есть ли разумный способ обернуть создание потока тройника в c ++ 11 ?

Вот моя попытка, которая не может быть скомпилирована из-за удаленных конструкторов копирования и отсутствующих конструкторов перемещения:

#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 голосов
/ 06 сентября 2018

Скомпилируйте штраф в c ++ 17 с "elision гарантия копирования" .

В 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)};
}

Демо

...