是否可以使用不同的运算符<<(lt)重载来写入文件和std :: cout?

时间:2016-11-01 20:40:54

标签: c++ file io operator-overloading iostream

编辑:class TF的定义:

class TF {
    std::vector<V4f> waypoints;
    std::vector<int> densityWaypoints;
public:
    std::size_t size() const { return waypoints.size(); }
    friend std::ostream& operator<<(std::ostream& str, const TF& tf);
    friend std::fstream& operator<<(std::fstream& str, const TF& tf);
    // methods here
};

这个问题可能源于我不理解流的事实,因此这可能是一个先决条件。

是否可能以某种方式重载operator<<(std::ostream, T),以便在为了在屏幕上显示数据结构而调用时,它使用一个重载,当数据结构写入文件时,使用另一个?这样的事情可能是:

std::ostream& operator<<(std::ostream& str, const TF& tf) {
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) {
        str << " { "
            << tf.densityWaypoints[i] << " : "
            << tf.waypoints[i][3] << " : "
            << tf.waypoints[i][0] << " , "
            << tf.waypoints[i][1] << " , "
            << tf.waypoints[i][2]
            << " } ";
    }
    str << "\n";
    return str;
}

std::fstream& operator<<(std::fstream& str, const TF& tf) {
    str << (int)tf.size();
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) {
        str << tf.densityWaypoints[i]
            << tf.waypoints[i][0]
            << tf.waypoints[i][1]
            << tf.waypoints[i][2]
            << tf.waypoints[i][3];
    }

这不会编译出一个奇怪的错误(我可能会感到厌倦):

  

错误:'operator&lt;&lt;'不匹配(操作数类型为'std :: fstream {aka std :: basic_fstream}'和'int')

添加第二个operator<<()重载时发生错误。第一个工作正常。尝试std::ofstreamstd::fstream同样的结果。

但我不确定它是否会起作用。当然可以定义像int writeTF(std:fstream& str, const TF&tf)这样的函数,但这对我来说看起来不够C ++,更不用说这里可能会出现的奇怪错误了。

1 个答案:

答案 0 :(得分:1)

我看过代码将ostream的地址与cout的地址进行比较。我对此感到好奇,但它肯定有用:

std::ostream& operator<<(std::ostream& o, Foo const&)
{
    if(&o == &std::cout) {
        return o << "cout";
    } else {
        return o << "not_cout";
    }
}

demo

请注意,cout输出到标准输出,它与&#34;屏幕&#34;不相同。