用于在C ++中打印到屏幕的std :: cout的更容易替代的替代方法

时间:2014-03-15 18:50:45

标签: c++ printf cout

通常我只想快速检查一系列变量的内容(让他们称之为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。

3 个答案:

答案 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”将提供对象当前内容的默认(通常是有用的)显示。

反正。是的,您总是可以努力缩短您的打字工作量。