当前位置:  开发笔记 > 编程语言 > 正文

如何以允许传递临时值的方式将std :: istream传递给函数?

如何解决《如何以允许传递临时值的方式将std::istream传递给函数?》经验,为你挑选了1个好方法。

我试图创建一个构造函数来从任何给它的istream加载资源.我似乎无法找出将istream参数传递给构造函数的最佳方法.

Loader::Loader(istream stream);

由于对象切片,这个很糟糕,所以没有选择.

Loader::Loader(istream& stream);

这就是我现在使用的,看起来还不错.它有一个重要的问题 - 你不能给它一个临时的,因为temporaries不能绑定到非const引用!例如,以下内容不起作用:

Container():
  mLoader(ifstream("path/file.txt", ios::binary)
{
}

这是一个限制,因为我现在被迫将ifstream存储为Container的成员变量,以延长其生命周期.

既然问题出现在非const引用中,那么就可以这样:

Loader::Loader(const istream& stream);

但是因为.seek()等是非const的,所以这也不是一个选择......

那么,如何以一种简洁的方式解决这个问题呢?



1> Richard Hodg..:

如果你的编译器是c ++ 11或更高版本,你可以简单地提供一个构造函数的版本,它将istreamr作为r值引用:

void Loader::Loader(std::istream&& is)

快速举例:

#include 
#include 
#include 
#include 

struct Loader
{
    Loader(std::istream& is)
    {
        read(is);
    }

    Loader(std::istream&& is)
    {
        read(is);
    }

    void read(std::istream& is)
    {
        is >> std::quoted(x);
        is >> std::quoted(y);
    }

    std::string x, y;
};

std::ostream& operator<<(std::ostream& os, const Loader& l)
{
    os << "x = " << l.x;
    os << ", y = " << l.y;
    return os;
}


auto main() -> int
{
    using namespace std;

    Loader l(istringstream(R"text("donkey" "horse")text"));
    cout << l << endl;

    istringstream not_temp(R"text("apple" "banana")text");
    Loader l2(not_temp);
    cout << l2 << endl;

    return 0;
}

预期产量:

x = donkey, y = horse
x = apple, y = banana

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有