假设我需要实现工厂函数,它返回继承/具有继承自boost :: noncopyable的成员的对象O.
struct O : boost::noncopyable {};
O factory() { return O(); }
Run Code Online (Sandbox Code Playgroud)
显然返回值无法编译.
您知道或使用哪种方法来实施此类工厂方法?如果可能的话,我真的想避免重写复制构造函数并返回值而不是引用或指针.
经过一些修补和来自codeka的链接我管理了这个(不知道这有多便携,似乎与g ++一起工作):
template<class E>
struct threads_parallel_for_generator
: for_generator<E, threads_parallel_for_generator<E> > {
typedef for_generator<E, threads_parallel_for_generator> base_type;
struct factory_constructor {
explicit factory_constructor(const E &expression)
: expression_(expression) {}
operator const E&() const { return expression_; }
private:
E expression_;
};
threads_parallel_for_generator(const factory_constructor & constructor)
: base_type(constructor, *this) {}
private:
boost::mutex mutex_;
};
template<class E>
static threads_parallel_for_generator<E>
parallel_for(const E &expression) {
typedef threads_parallel_for_generator<E> generator;
return typename generator::factory_constructor(expression);
}
Run Code Online (Sandbox Code Playgroud)
如果是不可复制的,则必须返回指针或引用.这是不可复制的要点.
如果您的类是不可复制的,那么您可能需要更改设计,因为您显然需要复制它.如果你有不可复制的成员,你无法改变,那么你的类可能会持有指向不可复制对象的指针?