【问题标题】:When to use std::swap for stream types?何时将 std::swap 用于流类型?
【发布时间】:2015-09-30 08:29:19
【问题描述】:

试图回答这个问题text-file-handling-in-c,并引用cplusplus.com。我遇到了std::swap-函数,用于fstream等流类型。

所以我的问题是: 交换功能的目的究竟是什么?对于“fstream”,我必须分别在哪种情况下使用它?

参考问答C++ std::ifstream in constructor problem 我知道流类型是不可复制的。参考问答What is the copy-and-swap idiom?,交换功能是例如用于实现复制构造函数,...那么具有swapping-feature 的流类型现在可以使用swap-feature 复制 -> 如果是这样,语言开发人员是如何实现它的?

【问题讨论】:

    标签: c++ c++11 stream copy-constructor copy-and-swap


    【解决方案1】:

    好吧,不出所料,当您想要交换流时,您使用std::swap 表示流。例如,您可以将其用于std::remove_if 来自流向量的所有“坏”流(好吧,这可能不是最好的例子。我想不出更好的方法)。

    至于它是如何工作的:从 C++11 开始,标准流是可移动构造和可移动分配的。因此,虽然您仍然无法复制它们,但您可以使用通用交换函数交换它们,例如:

    template <class T>
    void swap (T &a, T &b) {
        auto temp = std::move(a);
        a = std::move(b);
        b = std::move(temp);
    }
    

    现在我们的流被交换而无需复制它们。

    顺便说一句,可交换的流不会使它们可复制。当您查看示例复制赋值运算符时

    MyClass& operator=(const MyClass& other)
    {
        MyClass tmp(other);
        swap(tmp);
        return *this;
    }
    

    from the question you linked,你会注意到这一行:

    MyClass tmp(other);
    

    这需要一个复制构造函数,而流没有。

    【讨论】:

    • +1。此外,fstreamstringstream 还有专门的 swap 函数,它们比通用的 swap 算法效率略高。
    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 2020-12-12
    • 2021-10-01
    • 1970-01-01
    • 2018-07-29
    • 2015-03-23
    • 2012-12-22
    相关资源
    最近更新 更多