通常我只想快速检查一系列变量的内容(让他们称之为a,b,c,d和e,并假设它们是浮点数,整数和字符串的混合物)。我厌倦了打字
cout << a << " " << b << " " << " " << c << " " << " " << d << " " << e << endl;
在C ++中快速将一些变量转储到stdout是否有更方便(更少的按键)方式?或者C ++人员总是定义自己的简单打印功能?显然像
printf("%d %f %s %d %s\n",a,b,c,d,e);
不是我想要的替代方案,而是
之类的东西print a,b,c,d,e
甚至
print*, a,b,c,d,e
或
write(*,*) a,b,c,d,e
打字不太方便。
当然,谷歌搜索&#39;快速打印到C ++屏幕上&#39;一直把我送回std :: cout。
答案 0 :(得分:5)
是这样,你想要什么?
print(a, b, c);
就是这样。
template <typename T>
void print(T t)
{
std::cout << t << " ";
}
template<typename T, typename... Args>
void print(T t, Args... args)
{
std::cout << t << " ";
print(args...) ;
}
答案 1 :(得分:2)
很容易创建&#34; print&#34;具有重载模板operator,
的类,然后您可以执行类似
print(),a,b,c,d;
表达式print()
将创建print
类的临时实例,然后使用该临时实例使用逗号运算符进行打印。临时实例将在表达式结束时被销毁(在调用最后一次逗号重载之后)。
实现可能如下所示:
struct print
{
template<typename T>
print& operator,(const T& v)
{
std::cout << v;
return *this;
}
};
注意:这是我的想法,没有任何测试。
答案 2 :(得分:1)
是否有更方便(更少的击键)方式快速转储a 在C ++中使用stdout的变量很少?
我不得不说不,不是用语言。但我不认为std :: cout是一个具有挑战性的数字。
您可以尝试其他答案提供的模板方法。
但是你应该尝试GDB(或者你的系统上有一些调试器)。 GDB可以根据 no _effort_来“转储”自动变量,因为当前堆栈帧的自动变量在“Locals”窗口中始终保持最新。
或者C ++人员总是定义自己的简单打印功能吗?
不,或者某事。
我使用std :: cout和std :: cerr(如定义的)进行大量调试,但不是在“我如何保存最常打字”的框架中。
我认为创建'便利'(即不需要)功能适合做你想重复的事情。我的经验法则是3次...如果我做了3次(或更多次)特定的事情(比如生成一个带有相同或相似变量的std :: cout语句)那么我可能会写一个函数(而不是复制)这条重复的努力。
通常,我使用两种(我称之为)一次性调试方法中的一种......并且我的大多数对象也同时具有show()和dump(),并且可以有多个show / dump函数或方法,每个具有不同的签名和默认值。
if(dbg1) show(a,b,c,d,e);
if(dbg1b) show(b);
// etc
和
if(dbg2) dump(a,b,c,d,e);
显示通常使用并执行std :: cout提供的内容,以及其他内容。
Dump执行show所做的操作,但也可以提供数据的备用视图,可以是值的十六进制或二进制转换,也可以是表。什么都有帮助。
Disposable并不意味着我会处理它们,而是我可能会,并且我经常厌倦不会改变的输出,所以当这段代码似乎工作时我将dbgX设置为false,至少在我决定之前处理调试调用。
但是,你必须实现每个函数和方法,是的,你将不得不学习输入。
如果这些变量是自动的,您应该知道调试器GDB会自动在名为“Locals”的窗口中显示它们,并在单步执行期间使它们保持最新状态。
在GDB中,对象实例内容通常可以使用“p * obj”显示,并且有一些方法可以将特定的obj名称添加到本地显示窗口。
运行GDB并不需要太多。如果你反对在上面创建80个char std :: cout代码,那么启动GDB,在main中设置break,在gdb控制下运行简单任务所需的输入要少得多(然后单步执行代码中的任何步骤)而不仅仅是您插入show()或dump()命令的位置。
如果你有GDB,你也可以命令使用“p show()”(当show()函数在范围内时)打印,以查看范围内变量对std :: cout的看法(如果你不相信“当地人”的窗口。)
GDB允许您在单步执行实例的方法时“p this-&gt; show()”,或者当myObj可访问时“p myObj-&gt; show()”。
另外,“p * this”和“p * myObj”将提供对象当前内容的默认(通常是有用的)显示。
反正。是的,您总是可以努力缩短您的打字工作量。