一次性计算的设计模式

时间:2013-06-26 07:21:06

标签: c++ design-patterns

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

我想要根据一组输入对象创建一个对象。在我的特定情况下,这些是像对象一样的流。在计算过程中,我需要跟踪这么多状态,我不想将其作为函数参数传递,但也不想在我需要计算值的命名空间中进行规范。所以我所做的就是创建一个大致如下的类:

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()两次没有意义。我可以通过检查它是否已被调用来防范它,但我想使用一个构造,它本身就阻止了它被调用两次。 (注意:我已经在某个函数调用中包装了这个对象,它不应该在其他任何地方使用,但那并不漂亮。)

1 个答案:

答案 0 :(得分:1)

基本上,get()从您的对象移动。让用户执行此操作的最佳方法是让他们在调用get()之前移动您的对象。这是通过rvalue-reference-qualified成员函数完成的。

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

必须将其称为std::move( obj ).get()。简单obj.get()无效。

当然,你永远不需要move一个右值,所以另一方面objectCreator( … ).get()会起作用。

此语言功能的编译器支持仍然存在,因此您可能需要升级和/或Clang端口。