为流提供unique_ptr是否有意义?

时间:2014-10-29 02:51:49

标签: c++ c++11

我经常看到std::fstream通过引用传递...但是你无法复制它们,所以如果它在一个类中,那么对它的引用似乎是挑剔的。在这种情况下,我更愿意使用std::unique_ptr。更好的方法是:

struct Handle
{
    Handle(std::string filename)
    {
        fstr.open(filename);
    }
    Handle(const Handle& o) = delete;
    Handle& operator=(const Handle& o) = delete;
private:
    std::ifstream fstr;
};

或:

struct Handle
{
    Handle(std::string filename)
        : fstr(std::make_unique<std::ifstream>(filename))
    {
    }
private:
    std::unique_ptr<std::ifstream> fstr;
};

这两种形式都可以防止复制,但后一种形式可以减少打字。

1 个答案:

答案 0 :(得分:5)

在您的两个示例中,Handle实际上都会从std::ifstream中减去功能。最好使用std::ifstream而不是Handle

第一个示例采用可移动 std::ifstream,并使其无法移动。

第二个例子让它再次移动,但分配成本不必要。

您的示例都没有使其可复制(并且它们不应该)。

以与std::ifstream相同的方式传递std::unique_ptr<std::ifstream>,但没有笨拙的指针语法。 std::ifstreamMoveConstructibleMoveAssignable。您可以按工厂函数的值返回它,或者按值将其传递给接收器函数(如果移动) - 就像unique_ptr一样。

警告:gcc尚未实现移动流,因此,如果这是您所在的平台,则您的第二个Handle承诺作为临时解决方案。