C++;:更改单个输出操作的格式输出 我有一个C++课程的练习,但我不理解提供的代码。问题是:如果我们可以更改格式,只输出一个值(如下面的代码段所示),那就太好了 Form gen4(4); void f(double d){ Form sci8=gen4; sci.scientific().setprecision(8); std::cout << gen4(d) << " back to old options: " << d << std::endl; } 格式gen4(4); 空f(双d){ 表sci8=gen4; sci.scientific().setprecision(8); std::cout
为了完整起见,以下是我使用评论中给出的建议给出的答案: 表格hC++;:更改单个输出操作的格式输出 我有一个C++课程的练习,但我不理解提供的代码。问题是:如果我们可以更改格式,只输出一个值(如下面的代码段所示),那就太好了 Form gen4(4); void f(double d){ Form sci8=gen4; sci.scientific().setprecision(8); std::cout << gen4(d) << " back to old options: " << d << std::endl; } 格式gen4(4); 空f(双d){ 表sci8=gen4; sci.scientific().setprecision(8); std::cout,c++,c++11,C++,C++11,为了完整起见,以下是我使用评论中给出的建议给出的答案: 表格h 感谢Igor Tandetnik的完整性,以下是我根据评论中给出的建议给出的答案: 表格h 多亏了Igor Tandetnik,表单可以提供操作符()(double)返回某个代理类的实例(比如,FormatDouble),该类存储了格式参数和double值。FormatDouble::operatorI怀疑它可能是操作符()但是谷歌搜索这些东西很困难,因为谷歌会去掉一些特殊的字符,比如()。谢谢你的评论,如果你回答我可以接受。另一个
感谢Igor Tandetnik的完整性,以下是我根据评论中给出的建议给出的答案: 表格h
多亏了Igor Tandetnik,
表单
可以提供操作符()(double)
返回某个代理类的实例(比如,FormatDouble
),该类存储了格式参数和double值。FormatDouble::operatorI怀疑它可能是操作符()但是谷歌搜索这些东西很困难,因为谷歌会去掉一些特殊的字符,比如()。谢谢你的评论,如果你回答我可以接受。另一个选择是使用Form::operator()(…)
将格式正确的值写入stringstream
,并返回相应的字符串
。这可能不如@IgorTandetnik的解决方案有效,另一方面可能更方便。这是一个很好的实用解决方案,但我认为为了完成此任务,Igors解决方案更有意义。Form
可以提供operator()(double)
返回某个代理类(例如,FormatDouble
)的实例,该类存储格式参数和双精度值。FormatDouble::operatorI怀疑它可能是operator(),但谷歌搜索这些东西很困难,因为谷歌会删除像()。谢谢你的评论,如果你回答我可以接受。另一个选择是使用Form::operator()(…)
将格式正确的值写入stringstream
,并返回相应的字符串
。这可能不如@IgorTandetnik的解决方案有效,另一方面可能更方便。这是一个很好的实用解决方案,但我认为为了完成这项任务,Igors解决方案更有意义。
Form gen4(4);
void f2(double d){
Form sci8=gen4;
sci8.scientific().setprecision(8);
std::cout << sci8 << d << endl;
// from now on, all output will use the format defined by sci8
// (until changed again)
}
#pragma once
#include <iostream>
class Form{
public:
int prc, wdt, fmt;
bool sci = false;
Form(int p=6) : prc(p) {
fmt=wdt=0;
}
Form& scientific() {
sci = true;
return *this;
}
Form& precision(int p) {
prc=p;
return *this;
}
Form& operator()(double d){
std::ios::fmtflags f(std::cout.flags());
if(sci){
std::cout.setf(std::ios_base::scientific);
std::cout.precision(prc);
}
std::cout << d;
std::cout.flags(f);
return *this;
}
};
std::ostream& operator<<(std::ostream& os, const Form& f){
return os;
}
#include <iostream>
#include "include/form.h"
Form gen4(4);
void f(double d){
Form sci8=gen4;
sci8.scientific().precision(8);
std::cout << sci8(d) << " back to old options: " << d << std::endl;
}
int main() {
// Task1
f(64959.454243425);
return 0;
}
6.49594542e+04 back to old options: 64959.454