假设我需要实现返回对象O的工厂函数,该对象O继承/具有从boost :: noncopyable继承的成员。
struct O : boost::noncopyable {};
O factory() { return O(); }
显然返回值无法编译。
您了解或使用哪种方法来实施此类工厂方法?我真的很想避免重写复制构造函数,如果可能的话,返回值而不是引用或指针。
经过一些修补和来自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);
}
答案 0 :(得分:7)
如果是不可复制的,则必须返回指针或引用。这是不可复制的要点。
如果您的类是不可复制的,那么您可能需要更改设计,因为您显然需要复制它。如果你有不可复制的成员,你无法改变,那么你的类可能会持有指向不可复制对象的指针吗?
答案 1 :(得分:3)
Boost确实以BOOST_MOVABLE_BUT_NOT_COPYABLE的形式支持这一点,但在我看来,实现它的麻烦远远超过它的价值(没有C ++ 11)而只返回(智能)指针要容易得多...