Фабричная функция C ++ с boost :: noncopyable - PullRequest
3 голосов
/ 02 июля 2010

Предположим, мне нужно реализовать фабричную функцию, которая возвращает объект O, который наследует / имеет членов, унаследованных от boost :: noncopyable.

struct O : boost::noncopyable {};
O factory() { return O(); }

Очевидно, возвращаемое значение не компилируется.

Какой методВы знаете или используете для реализации таких заводских методов?Мне действительно нравится избегать переопределения конструктора копирования, если это возможно, и возвращать значение, а не ссылку или указатель.

после некоторой обработки и ссылки с кодеки, я справился с этим (не знаю, как это делает переносимый, кажется, работает сг ++):

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 ]

7 голосов
/ 02 июля 2010

Если не может быть скопировано, вы должны вернуть указатель или ссылку. Это точка не копируемой.

Если это ваш класс, который нельзя скопировать, то вам, вероятно, нужно изменить дизайн, поскольку вам, очевидно, нужно его скопировать. Если у вас есть члены, которые нельзя скопировать, которые вы не можете изменить, то, возможно, ваш класс мог бы содержать указатели на объекты без возможности копирования?

3 голосов
/ 02 июля 2010

Boost действительно поддерживает это в виде BOOST_MOVABLE_BUT_NOT_COPYABLE , но, по моему мнению, это гораздо больше проблем, чем стоит реализовать (без C ++ 11), и просто вернуть (умный) указатель гораздо проще ...

...