为什么不允许对一个临时对象进行非const引用,哪个函数getx()返回?显然,这是C++标准禁止的,但我对这种限制的目的感兴趣,而不是对标准的引用.
struct X
{
X& ref() { return *this; }
};
X getx() { return X();}
void g(X & x) {}
int f()
{
const X& x = getx(); // OK
X& x = getx(); // error
X& x = getx().ref(); // OK
g(getx()); //error
g(getx().ref()); //OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ref()可以修改临时对象. ref()允许您欺骗编译器并获取此临时对象的链接,这解决了我们的问题.此外:
他们说"为const引用分配一个临时对象可以延长这个对象的生命周期","但是对于非const引用却没有任何说法".我的其他问题.以下赋值是否延长了临时对象的生命周期?
X& x = getx().ref(); // OK
Run Code Online (Sandbox Code Playgroud) 如果我将任意数量的操纵器应用于流,是否有办法以通用方式撤消这些操纵器的应用程序?
例如,请考虑以下事项:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << "Hello" << hex << 42 << "\n";
// now i want to "roll-back" cout to whatever state it was in
// before the code above, *without* having to know
// what modifiers I added to it
// ... MAGIC HAPPENS! ...
cout << "This should not be in hex: " << 42 << "\n";
}
Run Code Online (Sandbox Code Playgroud)
假设我想添加代码MAGIC HAPPENS,将流操纵器的状态恢复到我之前的状态cout << hex.但我不知道我添加了什么操纵器.我怎么能做到这一点?
换句话说,我希望能够写出这样的东西(psudocode/fantasy …
我试图通过设置不同字段的宽度在C++上创建一个整齐格式的表.我可以使用setw(n),做类似的事情
cout << setw(10) << x << setw(10) << y << endl;
Run Code Online (Sandbox Code Playgroud)
或更改ios_base :: width
cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;
Run Code Online (Sandbox Code Playgroud)
问题是,这两种选择都不允许我设置默认的最小宽度,每次我都要向流写入内容时我必须更改它.
有没有人知道我可以做到这一点而无需无数次重复同一次呼叫?提前致谢.
我最近被这样的事实所困扰:ios_base::width和/或setw操纵器必须在写入流的每个项目时重置.
也就是说,你必须这样做:
while(whatever)
{
mystream << std::setw(2) << myval;
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
mystream.width(2);
while(whatever)
{
mystream << myval;
}
Run Code Online (Sandbox Code Playgroud)
好的.
但有谁知道为什么做出这个设计决定?是否有一些我缺失的理由,或者这只是标准的一个黑暗角落?
其他流格式修饰符(如链接的SO问题中所述)是"粘性",而setw不是.
使用时cout,<iomanip>标题中定义的默认格式化程序是什么?换句话说,一旦我将格式化程序设置为fixed使用cout << fixed << setPrecision(2),我该如何更改它?或者,我将它改回来的是什么?
在C++程序中,我有一些代码来打印一个名为fraction的类的对象.它的变量是n(分子),d(分母)和sinal(信号:当分数为正时为真,否则为假).
ostream &operator << (ostream &os, const fraction &x){//n=0
if(!x.sinal)
os << "-";
os << x.n;
if(x.d!=1 && x.n!=0)
os << "/" << x.d;
return os;
}
Run Code Online (Sandbox Code Playgroud)
它做得很好,但当我尝试在其中使用setw()时,它无法正常工作:它只影响要打印的第一个项目(无论是信号还是分子).
我试图改变它,我找到的解决方案是首先将其转换为字符串,然后使用带有iomanip的操作系统:
ostream &operator << (ostream &os, const fraction &x){//n=0
string xd, xn;
stringstream ssn;
ssn << x.n;
ssn >> xn;
stringstream ssd;
ssd << x.d;
ssd >> xd;
string sfra = "";
if(!x.sinal)
sfra += "-";
sfra += xn;
if(x.d !=1 && x.n != 0){
sfra += "/";
sfra += xd;
} …Run Code Online (Sandbox Code Playgroud) 所以我必须发送到std::cout一列数据,我必须在数据周围显示一些字符,如:
Plot Points
(0,0), (2,3)
(1,10), (12,14)
Run Code Online (Sandbox Code Playgroud)
我必须在列标题中的字母"s"输入下右对齐最后右括号"Points".
我把数据输出如下:
cout << right << setw(12) << "(" << x1 << "," << y1 << "), (" << x2 << "," << y2 << ")";
Run Code Online (Sandbox Code Playgroud)
但是我看到的所有例子似乎都表明正确而且setw似乎只影响我发送给的下一条数据cout,因此在这种情况下"("只有.
有没有办法将所有这些字符和变量组合在一起,以便在输出列中将它们全部合理化?
我只是在学习C++,所以期待有一些我还没有学到的简单解决方案吗?
应该是一个微不足道的问题,但发现setw仅适用于其紧接着的输出,并且不确定如何允许它应用于以下所有输出.
例如,对于以下代码行
cout<<setw(3)<<setfill('0')<<8<<" "<<9<<endl;
Run Code Online (Sandbox Code Playgroud)
要么
cout.width(3);
cout.fill('0');
cout<<8<<" "<<9<<endl;
Run Code Online (Sandbox Code Playgroud)
我希望输出008 009代替008 9
我正在做一个学校项目,我需要经常更改文本颜色.项目目标是目前仅适用于Windows的控制台应用.将代码块与MinGW一起使用进行调试.我不是菜鸟,但是中级.
所以在代码中无处不在使用它是丑陋的:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), __col._colour_code);
Run Code Online (Sandbox Code Playgroud)
即使我把它包装在一个函数中,它仍然很麻烦和丑陋,因为你不能继续你的cout链.你必须打破链条,因为你必须SetColour在一个新的声明中调用,例如:
SetColour(GRAY); cout << setcol(PURPLE) << " ID:[";
SetColour(AQUA); cout << song.GetID();
SetColour(GRAY); cout << "]" << " ";
SetColour(GREEN); cout << song.GetTitle();
SetColour(WHITE); cout << " by ";
SetColour(BRIGHT); cout << song.GetArtist() << "\n";
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的功能setw,setprecision等于是我打开了iomainp.h,并找了一些提示:
struct _Setw { int _M_n; };
inline _Setw
setw(int __n)
{ return { __n }; }
template<typename _CharT, typename _Traits>
inline basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
{
__is.width(__f._M_n);
return __is; …Run Code Online (Sandbox Code Playgroud) 我认为setprecision不会改变变量本身的值.此外,当您将setprecision附加到cout时,它只会粘贴一次.但是,当我运行代码来验证时,它不起作用.
请考虑以下代码段:
int main()
{
double x = 9.87654321;
cout << setprecision(3) << fixed << x <<endl; //Returns 9.877 as it should
cout << x << endl; //Returns truncated value 9.877 again though it shouldnt.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我们用cout << x << endl;线设置精度替换为7,那么它会显示正确的值.谁能解释一下这个现象吗?
我有这个:
uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
如何将其转换为char或其他内容,以便可以阅读其内容?这是我用于使用AES加密数据的密钥。
感谢帮助。谢谢