gpt4 book ai didi

c++ - 有什么方法可以包装 boost "tee"流的构造以进行自动类型推导?

转载 作者:行者123 更新时间:2023-11-27 23:44:00 28 4
gpt4 key购买 nike

boost::iostreams::tee 和公司有一点嘈杂/重复的用法,如下所示:

C++ "hello world" Boost tee example program

目标是做出类似的东西:

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

在尝试用函数 make_tee 包装此用法以允许对参数进行自动类型推导后,我意识到复制和移动构造函数都无法用于必要的类型。

那么:有没有一种合理的方法来在 c++11 中包装 tee 流的创建

这是我的尝试,由于删除了复制构造函数和缺少移动构造函数而无法编译:

#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> > >'

最佳答案

使用“保证复制省略” 在 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

关于c++ - 有什么方法可以包装 boost "tee"流的构造以进行自动类型推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52210337/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com