我不喜欢using namespace std
,但我也厌倦了键入std::
在每一条战线cout
,cin
,cerr
和endl
.所以,我想给他们这样简短的新名字:
// STLWrapper.h
#include <iostream>
#include <string>
extern std::ostream& Cout;
extern std::ostream& Cerr;
extern std::istream& Cin;
extern std::string& Endl;
// STLWrapper.cpp
#include "STLWrapper.h"
std::ostream& Cout = std::cout;
std::ostream& Cerr = std::cerr;
std::istream& Cerr = std::cin;
std::string _EndlStr("\n");
std::string& Endl = _EndlStr;
Run Code Online (Sandbox Code Playgroud)
这有效.但是,上面有什么问题我错过了吗?有没有更好的方法来实现同样的目标?
sbi*_*sbi 84
亚历克斯给了你一个如何在语法上解决这个问题的答案.但是,我想指出关于这个问题的另外两个论点:
无论你是使用using指令(using namespace std
)还是其较小的邪恶妹妹,使用声明(using std::cout
),重载都可能导致令人讨厌的惊喜.std::
与花半夜调试来找出你的代码std::distance()
而不是你自己的distance()
函数相比,输入并不是很麻烦,只是因为你犯了一个小错误而且std::distance()
意外地是一个更好的匹配.
一行代码被写入一次,但是 - 根据其生命周期 - 它被读取数十,数百甚至数千次.因此,编写一行代码所花费的时间根本不重要,重要的只是读取和解释一行代码所花费的时间.即使用一个适当std::
的位置写一条线需要花费三倍的时间,如果它的读取速度只提高了10%,那么它仍然值得一试.
所以重要的问题是:是否更容易阅读和解释一系列代码,std::
或者更难?从另一个答案:
这里还有一个数据点:很多年前,我也常常发现它必须为标准库中的所有内容添加前缀
std::
.然后我在一个项目中工作,在开始时决定using
禁止指令和声明,除了函数范围.你猜怎么着?我们大部分时间花了很长时间才习惯编写前缀,经过几个星期后,我们大多数人甚至同意它实际上使代码更具可读性.(这是有原因的:无论你喜欢更短或更长的散文都是主观的,但前缀客观上增加了代码的清晰度.不仅是编译器,而且你也发现更容易看到引用哪个标识符.)十年来,该项目增长了数百万行代码.由于这些讨论一次又一次地出现,我曾经很好奇这个(允许的)功能范围
using
实际上在项目中的使用频率.我找了它的来源,只发现了一两个地方使用它.对我而言,这表明,一旦尝试过,开发人员std::
即使每100kLoC使用一次指令也不会感到痛苦,即使在允许使用它的情况下也是如此.
我觉得很遗憾你会发现每本书和教程都会跳过std::
,因为这会让人们习惯于以这种方式阅读代码.当我教C++几年(在上述经历之后)时,我告诉我的学生我不想using
在他们的代码中看到任何指令或声明.(该规则的唯一例外是using std::swap
,BTW,你需要在swap(a,b)
命名空间之外获取重载std
.)一旦他们习惯了,他们就不介意了,当被问及时,他们说他们找到没有std::
前缀混乱的代码.有些人甚至在std::
他们从没有它的书或教程中输入的代码中添加了前缀.
一句话:键入的内容std::
是如此之难以致每个人都如此努力?到现在为止,我已经做了超过15年,我完全不会错过using
.
Ale*_*lli 59
为什么不
using std::cin;
using std::cout;
Run Code Online (Sandbox Code Playgroud)
等等?然后在您的代码中,您可以使用cin
,cout
等等,而不会意外地将所有其余的std
命名空间注入到您的代码中.