2013-03-07 3 views
1

, 그것은 쉽게 할 충분 :복사 생성자에서 범용 복사 생성자 템플릿으로의 위임은 어떻게해야합니까? 나는 보편적 복사 생성자 (모든 인수의 형태를 취할 것 하나)를 작성하려는 경우

class Widget { 
public: 
    template<typename T> Widget(T&& other); 
}; 

이 전통적인 복사 생성자를 생성하지 컴파일러를 방지, 그래서하지 않습니다 직접 작성하고 템플릿에 위임하고 싶습니다. 그러나 나는 그것을 어떻게합니까?

class Widget { 
public: 
    template<typename T> Widget(T&& other); 
    Widget(const Widget& other): ??? {}   // how delegate to the template? 
}; 

나는

Widget(const Widget& other): Widget<const Widget&>(other){} 

하지만 VC11,의 위임 생성자이 방법을 쓸 GCC 4.8을 시도하고, 모두가 거부 3.2 연타.

작성하려는 위임 복사 생성자는 어떻게 작성합니까?

+1

복사 생성자의 경우 템플릿 인수를 삭제하고'std :: move'를 사용하여 컴파일합니다. –

+0

@JoachimPileborg : 영리합니다. 따라서 Lvalues는 rvalues로 전달되지만 const이므로 이동 할 수 없습니다. 애매한,하지만 그것은 작동합니다! – KnowItAllWannabe

+5

왜 이걸 원하니? "보편적 인 복사 생성자"가 아닌 욕심 많은 * 변환 * 생성자가있는 경우에는 대개 실제 복사 생성자와 근본적으로 다른 작업을 수행해야합니다. 또한 일반적인 문제는 물건을 복사 할 때 범용 생성자가 호출되지 않기를 바란다는 것입니다. – Xeo

답변

3

생성자 템플릿에 템플릿 인수를 지정할 수 없습니다. 당신은 공제에 국한됩니다. 어쩌면 당신은 my old posts 중 하나에서 answer을 적용 할 수 있습니다 :

// NOT Tested! 
#include <utility> 

class Widget 
{ 
    enum fwd_t { fwd }; 

    // Your true master constructor 
    template< typename T > Widget(fwd_t, T &&t); 

public: 
    template < typename T > 
    Widget(T&& other); 
     : Widget(fwd, std::forward<T>(other)) 
    {} 
    Widget(const Widget& other) 
     : Widget(fwd, other) 
    {} 
}; 

두 개의 단일 인자 생성자를 앞으로 2 개의 인수를 형제 생성자.

+0

나는 JoachimPileborg의 제안 (2013 년 3 월 7 일 논평에서)이 새로운 생성자를 도입하는 것을 포함하지 않기 때문에 실제로 더 좋아졌지만 귀하의 접근 방식 역시 완벽하게 합리적인 것으로 보입니다. – KnowItAllWannabe