为输出流预配置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
相关产品推荐
相关产品推荐

