2010-07-02 76 views
3

假設我需要實現工廠函數,它返回繼承/成員繼承自boost :: noncopyable的對象O.具有boost :: noncopyable的C++工廠函數

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

Boost支持這種形式的BOOST_MOVABLE_BUT_NOT_COPYABLE,但在我看來,它比實現它更有難度(不使用C++ 11),只是返回一個(智能)指針更容易...

+0

問題可能對我來說是值得的,如果它導致更清晰的語法(我正在與一些瘋狂的模板表達式一起工作,以boost :: mutex結婚) – Anycorn 2010-07-02 06:58:55

+0

@aaa:當然,我想這隻取決於情況。 – 2010-07-02 07:00:38

7

如果是不可複製,那麼你必須返回一個指針或引用。這是不可複製的。

如果您的課程是不可複製的,那麼您可能需要更改設計,因爲您顯然需要複製它。如果你有不能複製的成員,那麼你的類可能會持有指向不可複製對象的指針?

+0

我知道你的觀點,但有些情況下直接實例化非可複製對象太困難。我認爲你的回答應該是一個評論。可能是 – Anycorn 2010-07-02 06:55:04

+0

設計問題。然而,我不需要複製,我需要從工廠函數中移動對象(實質上是構造函數以隱藏對象中的瘋狂模板實例化參數)。在我的情況下,握住指針確實會破壞不可複製的目的 – Anycorn 2010-07-02 07:07:53

+2

轉移指針的所有權 - 這正在發生。 – Gary 2010-07-02 07:09:58