编写自定义ostream运算符的现代模式

时间:2017-04-16 04:53:27

标签: c++11 iostream rvalue-reference

注意后来添加:经过一些实验后,我意识到我不需要为r值ostream重载,库已经为我做了。只需要具有l值版本,并且库具有一些转发到已实现的重载的r值版本。

因此,在C ++ 11中,即使没有自定义r值重载,也允许std::ofstream("file") << A{}

通常在C ++中,我们用这种方式定义自定义ostream operator<<

class A {
    int impl_;
    friend std::ostream& operator<<(std::ostream& os, A const& self){
       return os << "A:" << self.impl_;
    }
};

但是现在,在C ++ 11之后,有r值引用,事实上,内置类型可以流式传输到r值std::ostream引用。 现在允许这样做:

int i = 5;
std::ofstream("file") << i;

(我不知道这是否是定义特殊重载的原因。)

这是否意味着为了保持一致性,应该为自定义类定义两个运算符?像这样,

class A {
    int impl_;
    friend std::ostream& operator<<(std::ostream& os, A const& self) {
       return os << "A:" << self.impl_;
    }
    friend std::ostream&& operator<<(std::ostream&& os, A const& self) {
       os << "A:" << self.impl_; 
       return std::move(os);
    }
};

或更精简,

class A {
    int impl_;
    friend std::ostream& operator<<(std::ostream& os, A const& self) {
       return os << "A:" << self.impl_;
    }
    friend std::ostream&& operator<<(std::ostream&& os, A const& self) {
       return std::move(os << self); // calls the other overload
    }
};

目前在C ++ 11中重载operator<<的推荐方法是什么?

0 个答案:

没有答案