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

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,c++,c++11,C++,C++11,为了完整起见,以下是我使用评论中给出的建议给出的答案: 表格h 感谢Igor Tandetnik的完整性,以下是我根据评论中给出的建议给出的答案: 表格h 多亏了Igor Tandetnik,表单可以提供操作符()(double)返回某个代理类的实例(比如,FormatDouble),该类存储了格式参数和double值。FormatDouble::operatorI怀疑它可能是操作符()但是谷歌搜索这些东西很困难,因为谷歌会去掉一些特殊的字符,比如()。谢谢你的评论,如果你回答我可以接受。另一个

为了完整起见,以下是我使用评论中给出的建议给出的答案: 表格h


感谢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