带有boost :: noncopyable的C ++工厂函数

时间:2010-07-02 06:46:56

标签: c++ boost factory

假设我需要实现返回对象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);
}

2 个答案:

答案 0 :(得分:7)

如果是不可复制的,则必须返回指针或引用。这是不可复制的要点。

如果您的类是不可复制的,那么您可能需要更改设计,因为您显然需要复制它。如果你有不可复制的成员,你无法改变,那么你的类可能会持有指向不可复制对象的指针吗?

答案 1 :(得分:3)

Boost确实以BOOST_MOVABLE_BUT_NOT_COPYABLE的形式支持这一点,但在我看来,实现它的麻烦远远超过它的价值(没有C ++ 11)而只返回(智能)指针要容易得多...