【问题标题】:C++ if-else statement inside coutcout 中的 C++ if-else 语句
【发布时间】:2016-02-19 08:54:34
【问题描述】:

我想做这样的事情:

ostream& table(ostream& os, myClass& obj, bool foo1, bool foo2) {
    os << (foo1 ? obj.getFoo1() : "") << (foo2 ? obj.getFoo2() : "");
    return os;
}

现在我的主要问题是,我不需要else 声明。即使我不能在没有else 的情况下使用三元运算符,我也需要发送" " 之类的空间。我真的很想使用" ",但我的obj.getFoo 不返回任何字符串值(它返回一个整数)。对于整数,没有“空格”。

有没有办法在cout 中获取if-else 语句(显然没有else)?

【问题讨论】:

    标签: c++ if-statement ternary-operator cout ostream


    【解决方案1】:

    我个人会这样做:

    ostream& table(ostream& os, myClass& obj, bool foo1, bool foo2) {
       if (foo1)
          os << obj.getFoo1();
       if (foo2)
          os << obj.getFoo2(); 
      return os;
    }
    

    无论如何生成的代码几乎相同,并且会避免打印空字符串,这需要一些代码。

    三元运算符非常适合当您有一组非常长的函数参数并且只想改变一点点时:

    func(arg1, arg2, arg3, (flag)?arg4a:arg4b, arg5, arg6, arg7);
    

    [例如printf 语句]

    但是对于流输出的情况,它确实没有用处,因为代码用于:

     a << b << c;
    

    等同于:

     a << b; a << c; 
    

    [嗯,差不多,反正]

    【讨论】:

    • 我将拥有 49 种不同的 foo。这就是为什么我正在寻找一条捷径。
    • 那么我怀疑你做的事情有点错误(或非常错误)。但简短的版本是添加另一个函数:print_if_true(ostream&amp; os, bool cond, Type thing) { if (cond) os &lt;&lt; thing; } } 然后调用print_if_true(os, foo1, obj.getFoo1()); 等。如果obj.getFoo1() 返回不同的类型,您可能需要将其设为模板函数。
    【解决方案2】:

    如果你使用to_string就可以做到:

    ostream& table(ostream& os, myClass& obj, bool foo1, bool foo2) {
      os << (foo1 ? std::to_string(obj.getFoo1()) : "") 
         << (foo2 ? std::to_string(obj.getFoo2()) : "");
    
      return os;
    }
    

    LIVE DEMO

    【讨论】:

      【解决方案3】:

      使用foo1 ? std::to_string(obj.getFoo1()) : std::string(" ")

      【讨论】: