2010-07-02 2 views
3

boost :: noncopyable에서 상속 한 멤버를 상속하거나 갖는 오브젝트 O를 반환하는 팩토리 함수를 구현해야한다고 가정합니다.boost :: noncopyable을 사용하는 C++ 팩토리 함수

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

물론 반환 값은 컴파일되지 않습니다.

이러한 팩토리 메서드를 구현하는 데 사용하는 방법은 무엇입니까? 가능한 경우 복사 생성자를 재정의하는 것을 피하고 참조 또는 포인터 대신 값을 반환하는 것을 정말 좋아합니다. 나는이 관리 codeka에서 일부 땜질 및 연결 후

(이 작업을 수행, ++ g으로 작동하는 것 같다 방법 휴대용없는 생각) :

이 noncopyable입니다
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_MOVABLE_BUT_NOT_COPYABLE 형태로 지원되지만 내 생각에는 C++ 11을 구현하지 않고 (똑똑한) 포인터를 반환하는 것이 훨씬 쉽습니다.

+0

문제가 나를 위해 가치가있을 수 있습니다. 클리너 구문 (일부 미친 템플릿 표현을 boost :: mutex와 결합하여 작업하는 경우) – Anycorn

+0

@aaa : 확실하게 상황에 달려 있다고 생각합니다. –

7

경우에 당신은 포인터 나 참조를 반환해야합니다. 그것이 복사 불가능한 부분입니다.

클래스가 복사 불가능한 경우 분명히 복사해야 할 필요가 있으므로 디자인을 변경해야 할 수도 있습니다. 변경할 수없는 복사 불가능한 멤버가 있다면 클래스는 복사 불가능한 객체에 대한 포인터를 보유 할 수 있습니까?

+0

나는 당신의 요지를 알고 있지만, 복사 불가능한 객체를 직접 인스턴스화하는 것은 너무 어렵다. 나는 당신의 대답이 오히려 주석이어야한다고 생각합니다. – Anycorn

+0

디자인 문제 일 수 있습니다. 그러나, 나는 복사 할 필요가 없다. 나는 factory function으로부터 객체를 옮길 필요가있다. (본질적으로 생성자는 객체의 미적 템플릿 인스턴스화 매개 변수를 숨기는 것이다.) 지주 포인터는 실제로 내 경우에 복사 불가능한 목적을 무효로합니다. – Anycorn

+2

포인터의 소유권 이전 - 이동 중입니다. – Gary

관련 문제