0

我想知道是否有一个很好的设计模式,我目前通过以下构造实现了什么:

我有一个要基于一组输入对象创建的对象。在我的特殊情况下,这些是流式对象。在计算过程中,我需要跟踪这么多状态,我不想将它作为函数参数传递,也不想污染我需要计算值的命名空间。所以我要做的是创建一个大致如下所示的类:

class objectCreator {
public:
  objectCreator(stream_type & stream) : stream(stream) {
    create();
  }

  std::unique_ptr<value_type> get() { return std::move(result); }

private:

  void
  create() { /* ... */ }

  std::unique_ptr<value_type> result;
  stream_type & stream;

  // various state holding variables
};

我的问题是,清楚地调用get()两次没有意义。我可以通过检查它是否已经被调用来防范它,但我想使用一个结构,它本质上可以防止一个人调用它两次。(注意:我已经将此对象包装在某个函数调用中,它不应该在其他任何地方使用,但这并不美观。)

4

1 回答 1

1

从本质上讲,get()从您的对象移动。让用户执行此操作的最佳方法是要求他们在调用之前移动您的对象get()。这是通过右值引用限定的成员函数完成的。

std::unique_ptr<value_type> get() && { return std::move(result); }

这必须称为std::move( obj ).get(). 根本obj.get()行不通。

当然,您永远不需要move右值,因此objectCreator( … ).get()另一方面会起作用。

对此语言功能的编译器支持仍在到来,因此您可能需要升级和/或移植到 Clang。

于 2013-06-26T07:32:09.207 回答