gpt4 book ai didi

c++ - 并发 cout 格式化

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:27 25 4
gpt4 key购买 nike

这是一个学术问题。

sdt::mutex m;
typedef std::lock_guard<std::mutex> G;

void thread1(){
G g(m);
std::cout << std::setw(9);
std::cout << 3.14;
std::cout << std::endl;
}

void thread2(){
G g(m);
std::cout << std::setw(7);
std::cout << 3.14;
std::cout << std::endl;
}

我的问题是格式绑定(bind)到输出流,所以如果我想确定我生成的输出,我需要设置我线程上发明的所有格式选项。哪个明年会或不会。

  • 有什么方法可以在不手动设置所有内容的情况下将格式重置为默认值?
  • 如果不能,有什么好的解决方法?
    • 例如,我应该在我的线程本地创建并保留一个 std::ostringstream 并将 oss.str() 写入 std::cout?

最佳答案

为简洁起见,我使用了 boost,但您可以编写自己的可选和状态保护程序。

#include <mutex>
#include <iostream>
#include <iomanip>
#include <tuple>
#include <utility>
#include <boost/io/ios_state.hpp>
#include <boost/optional.hpp>

std::mutex m;

struct save_and_lock
{
boost::optional<boost::io::ios_all_saver> saver;
std::unique_lock<std::mutex> lock;

void init(std::ostream& os)
{
lock = std::unique_lock<std::mutex>(m);
saver.emplace(os);
os.flags(std::ios_base::fmtflags(0));
}

friend std::ostream& operator<<(std::ostream& os, save_and_lock&& s)
{
s.init(os);
return os;
}
};

void thread1(){
std::cout << save_and_lock() << std::setw(9) << 3.14 << std::endl;
}

void thread2(){
std::cout << save_and_lock() << std::setw(9) << 3.14 << std::endl;

}

这将起作用,因为用户定义的评估顺序 operator <<从左到右。

关于c++ - 并发 cout 格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46484652/

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