2

我有以下(简化的问题):

class Stream()
{ 
    std::ofstream mStr;
public:
    Stream() : mStr("file", ofstream::out)
    {}

    Stream(const Stream & rhs) = delete;

    Stream(Stream && rhs) : mStr(move(rhs.mStr))
    {}

    void operator()(string& data)
    {
        mStr << data;
    }

    ~Stream() = default;
};

该对象用于记录目的(测量数据),只会使用很短的时间,因此只要它还活着,它就会打开。现在的主要思想是这样使用它:

int main()
{
    std::function<void (std::string&)> Logger = Stream();
    for (std::string& data : DataList)
    {
        Logger(data);
    }
}

我遇到了问题(GCC 4.7.2)。

  1. 该类Stream需要有一个复制构造函数,如果我这样做,虽然它没有被使用。
  2. fstream我动不了

这是编译器问题还是我在这里遗漏了一些基本的东西?

4

2 回答 2

4

根据cppreference.com.function

template< class F > 
function( F f );

类型F应该是CopyConstructible,对象f应该是Callable

但是您的课程复制构造函数Streamdeleted

Stream(const Stream & rhs) = delete;

我无法移动fstream

这是libstdc++库的一个已知问题。以下代码使用 clang 和 编译得很好libc++

std::fstream f1, f2;
f2 = std::move(f1);

但是失败了libstdc++

于 2013-06-04T07:06:48.603 回答
0

作为一种解决方法,您可以使用 lambda 函数:

Stream s;
auto Logger = [&s] (std::string& data) {
    s(data);
};

for (std::string& data : DataList) {
    Logger(data);
}
于 2013-06-04T07:26:33.630 回答