我经常看到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;
};
这两种形式都可以防止复制,但后一种形式可以减少打字。
答案 0 :(得分:5)
在您的两个示例中,Handle
实际上都会从std::ifstream
中减去功能。最好使用std::ifstream
而不是Handle
。
第一个示例采用可移动 std::ifstream
,并使其无法移动。
第二个例子让它再次移动,但分配成本不必要。
您的示例都没有使其可复制(并且它们不应该)。
以与std::ifstream
相同的方式传递std::unique_ptr<std::ifstream>
,但没有笨拙的指针语法。 std::ifstream
是MoveConstructible
和MoveAssignable
。您可以按工厂函数的值返回它,或者按值将其传递给接收器函数(如果移动) - 就像unique_ptr
一样。
警告:gcc尚未实现移动流,因此,如果这是您所在的平台,则您的第二个Handle
承诺作为临时解决方案。