为什么我不能使用带+运算符的fixed和setprecision()代替&lt; <operator for =“”cout =“”

时间:2018-02-23 10:19:33

标签: c++ string operator-keyword fixed iomanip

=“”

为什么我不能使用&#34;固定&#34;和&#34; setprecision()&#34;使用+运算符将其格式化为字符串,并且我只能将其用于少于运算符的格式,以便为cout格式化它。我可以通过其他方式实现这一目标吗?

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    double a = 157.2734;
    cout << "This number is " << fixed << setprecision(1) << a << "." << endl;
    string line = "This number is " + fixed + setprecision(1) + a + "." + "\n"; // This doesn't work this way! Why!?!?!?
    cout << line;
    return 0;
}

1 个答案:

答案 0 :(得分:2)

  

为什么我不能使用&#34;固定&#34;和&#34; setprecision()&#34;使用+运算符将其格式化为字符串?

仔细查看std::fixedstd::setprecision()

std::fixed的完整签名:

std::ios_base& fixed(std::ios_base& str);

因此,它专门用于处理流。

std::setprecision()的情况下,它有点棘手:

/*unspecified*/ setprecision( int n );

然而:

  

返回未指定类型的对象,使得如果str是std :: basic_ostream类型的输出流的名称或std :: basic_istream类型的输入流,则表达式str&lt;&lt; setprecision(n)或str&gt;&gt; setprecision(n)的行为就像执行了以下代码一样:

  str.precision(n);

所以,如果有std::string::precision()方法但它没有一个方法可能会有效。

  

我可以通过其他方式实现这一目标吗?

可能的解决方案:

#include <iostream>
#include <sstream>
#include <iomanip>

using namespace std;

int main()
{
    double a = 157.2734;
    cout << "This number is " << fixed << setprecision(1) << a << "." << endl;
    ostringstream fmtStr;
    fmtStr << "This number is " << fixed << setprecision(1) << a << ".\n";
    string line = fmtStr.str();
    cout << line;
    return 0;
}

输出:

This number is 157.3.
This number is 157.3.

Life demo on ideone