You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为输出流预配置tostr格式化选项的实现问题及解决方案咨询

输出流预配置tostr格式化选项的实现问题及解决方案咨询

我自己写了一个模板函数tostr(...),它能把很多类型转换成字符串,还支持不少配置选项。举个使用例子:

std::vector<double> x = {1.123456789, 9.987654321};
std::cout << tostr(x, tostr_precision(4), tostr_sep("; "), tostr_lbrace("{ "), tostr_rbrace(" }")) << std::endl; 

这段代码会输出:

{ 1.1235; 9.9877 }

我现在想实现一种更便捷的用法——比如在调用tostr之前,直接在输出流里定义精度这类选项,像这样:

std::cout << tostr_precision(4) << tostr(x) << std::endl;

我本来打算通过定义这个运算符来实现:

std::ostream& operator<<(std::ostream& out, tostr_precision const& opt)
{
  get_opt_in_streams()[&out].set(opt);
  return out;
}

其中get_opt_in_streams()用来集中管理所有流的配置选项:

std::map<std::size_t,tostr_options>& get_opt_in_streams()
{
  static std::map<std::size_t,tostr_options> opt_in_streams;
  return opt_in_streams;
}

但现在这个方案有个问题:当某个使用了该配置的流被销毁时,对应的配置信息并不会从map里移除。更糟的是,新创建的流可能会和已销毁的流地址相同,导致错误地使用旧的配置选项。

有没有办法解决这个问题呢?比如像iomanip里的工具那样,给流里添加一个对象,在它的析构函数里做清理操作?我不知道这种思路是否可行,希望能得到指点。

备注:内容来源于stack exchange,提问作者Caduchon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:18:58