C流运算符问题

前端之家收集整理的这篇文章主要介绍了C流运算符问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想这可能是所有这里的大师的简单问题,但我以某种方式找不到答案.

我想要能像csv这样简单地编写csv单元格:

stream << 1 << 2 << "Tom" << std::endl;

这将创造出输出像1,2,汤姆.我该如何实现呢?我想我需要创建自定义streambuf(因为我不认为这是在流级别上执行的正确方法,只是为了重载<<<对于所有类型),但我不确定如何<通常实现.它是否调用put或write或什么.我应该覆盖那些还是什么?还是我完全错过了一些东西? 我很感激任何帮助:) 干杯,

解决方法

得到像98%的方式那样不是很难的事情:
#include <iostream>

class add_comma { 
    std::ostream &os;
    bool begin;
    typedef add_comma &ref;
public:
    add_comma(std::ostream &o) : os(o),begin(true) {}

    template <class T>
    ref operator<<(T const &t) { 
        if (!begin)
            os << ",";
        os << "\"" << t << "\"";
        begin = false;
        return *this;
    }

    ref operator<<(std::ostream &manip(std::ostream &o) ) {
        if (&manip == &std::endl)
            reset();
        manip(os);
        return *this;
    }

    void reset() { begin = true; }

    operator void *() { return (void *)os; }
};

int main() { 
    add_comma a(std::cout);

    a << 1 << 2 << "This is a string" << std::endl;
    a << 3 << 4 << "Another string" << std::endl;
    return 0;
}

编辑:我已经至少在某种程度上修改代码 – 现在只将逗号放在写入的项目之间,而不是一行的开头.然而,它只会将“endl”识别为表示新记录的开始 – 例如,字符串文字中的换行符将不起作用.

猜你在找的C&C++相关文章