我想知道是否有一个很好的设计模式,我目前通过以下构造实现的目标:
我想要根据一组输入对象创建一个对象。在我的特定情况下,这些是像对象一样的流。在计算过程中,我需要跟踪这么多状态,我不想将其作为函数参数传递,但也不想在我需要计算值的命名空间中进行规范。所以我所做的就是创建一个大致如下的类:
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()
两次没有意义。我可以通过检查它是否已被调用来防范它,但我想使用一个构造,它本身就阻止了它被调用两次。 (注意:我已经在某个函数调用中包装了这个对象,它不应该在其他任何地方使用,但那并不漂亮。)
答案 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端口。