c++ - 从 `<<` 返回 `operator<<` 的结果

标签 c++ stream overloading

关于operator<<的所有指南说你应该返回输出流:

ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; }

但是就不能简单一点吗?

ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; }

如果调用<<遵循指南并返回其第一个参数,那么它应该 100% 相同。但我是否依赖于一些没有保证的东西?在某些情况下会失败吗?

我为什么想要它?不仅仅是为了节省击键次数(我们不在 codegolf.SE 中) 实际用法有点复杂:

enum class Foo { A, B, C };
ostream & operator<<(ostream &os, const Foo &x) {
    switch (x) {
        case A: return os << "A";
        case B: return os << "B";
        case C: return os << "C";
    }
    return os << "Bad Foo (" << (int)x << ")";
}

与我找到的所有替代方案相比,多次返回使代码更加简单和可读(想象 50 个案例,而不是 3 个)。注意缺少default允许编译器警告缺少的情况,这样您在添加枚举值时就不会忘记添加一个。

最佳答案

假设您使用的重载返回一个引用,这些

ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; }
ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; }

将具有相同的效果并允许通常的链接

cout << Foo::A << Foo::B;

如果第一句话不成立(例如,调用其他一些不返回对流对象的引用的自定义重载),那么您必须显式返回流引用或提供不同的重载(如果您仍然这样做)想要链接这些语句。

关于c++ - 从 `<<` 返回 `operator<<` 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170560/

相关文章:

c++ - 是否允许为自定义数字类型专门化数学常量?

c++ - 错误 LNK2005 : _sprintf already defined in ntdll. lib(ntdll.dll)

android - 如何使用 Android 通过网络流式传输摄像机流,生成有效的视频文件?

C++函数重载

c++ - 从函数插入 vector

c++ - R 中的 Rcpp Quicksort 错误?

c++ - 使用 `getline(cin, s);` 后使用 `cin >> n;`

Java 8 的 Files.lines() : Performance concern for very long line

c++ - 候选函数集

c++ - qt c++ new 类似的方法。我是重载方法、编写新方法还是使用默认参数?