代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

C++标准库:如何编写CUT、CERP、CIN和EnDL的包装器?

  •  16
  • Ashwin Nanjappa  · 技术社区  · 15 年前

    我不喜欢 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;
    

    这是可行的。但是,上面有没有我遗漏的问题呢?有没有更好的方法来实现这一点?

    2 回复  |  直到 12 年前
        1
  •  58
  •   Alex Martelli    15 年前

    为什么不呢?

    using std::cin;
    using std::cout;
    

    等等?然后在代码中可以使用 cin , cout 等等,不意外地注射 std 名称空间到代码中。

        2
  •  82
  •   Community CDub    8 年前

    亚历克斯给了你 an answer 如何从句法上解决这个问题。但是,我想指出关于这个问题的另外两个论点:

    1. 无论你是否雇佣 使用指令 ( using namespace std )或者它的小邪恶姐妹,一个 使用声明 ( using std::cout )过载可能会导致严重的意外。打字没什么麻烦 std:: 相比于 花半个晚上调试 查明 your code called std::distance() instead of your own distance() function 因为你犯了一个小错误 STD::距离() 偶然是更好的匹配。

    2. 一行代码 只写一次 但是-取决于它的寿命- 它可以读几十、几百甚至几千遍 . 所以 编写一行代码所需的时间根本不重要 , 重要的是只需要花时间来阅读和解释一行代码 . 即使写一行字要花三倍的时间 性病: 在适当的地方,如果它使阅读速度只有10%,它仍然值得麻烦。
      所以重要的问题是: 是否更容易阅读和解释一行代码 性病: 到位还是更难? ?从 another answer :

      这里还有一个数据点:许多年前,我还发现在标准库的所有内容前面加上前缀会让人恼火 性病: . 然后我在一个项目中工作,在开始的时候决定 using 除函数作用域外,禁止使用指令和声明。你猜怎么着?我们大多数人花了几周的时间习惯于写前缀,几周之后,我们大多数人甚至同意它确实生成了代码。 更可读 . (这是有原因的: 不管你喜欢短文还是长文都是主观的,但是前缀客观地增加了代码的清晰度。 不仅是编译器,而且您也发现更容易看到引用了哪个标识符。)

      在十年的时间里,这个项目增加到了几百万行代码。由于这些讨论一次又一次地出现,我曾经好奇(允许的)功能范围的频率 使用 实际上是在项目中使用的。我找到了它的来源,只找到了一两打使用它的地方。对我来说,这表明, 一旦尝试,开发人员没有发现 性病: 足够痛苦 每100kloc使用一次指令 即使在允许使用的地方 .

      我觉得很遗憾的是,每一本书和教程都会漏掉 性病: 因为这让人们习惯了用这种方式阅读代码。当我教C++几年(在上述经验之后),我告诉我的学生我不想看到任何东西。 使用 其代码中的指令或声明。(唯一的例外是 using std::swap ,顺便说一句,你需要的是 swap(a,b) 拾取命名空间之外的重载 std 一旦他们习惯了它,他们就不介意了,当被问及它时,他们说他们发现代码没有 性病: 前缀混淆。 有些人甚至加入了 性病: 他们从没有它的书或教程中键入的代码的前缀 .

    底线:打字有什么难的? 性病: 每个人都为此兴奋不已?到目前为止,我已经做了15年了,我不会错过的。 使用 完全。