2013-12-23 2 views
1

모든 생성자를 구성원 데이터 구조로 전달하는 좋은 방법입니까?구성원 개체에 전달자 생성

template<typename VectorData> 
class VectorFunctionality 
{ 
    VectorData data; 
public: 
    VectorFunctionality() = default; 
    VectorFunctionality(const VectorFunctionality&) = default; 
    template<typename ...Args> 
    VectorFunctionality(Args... args) : data(std::forward<Args>(args)...) {}; 
}; 

는 VectorData는 수 std 수 :: 배열 STD : 벡터 등 VectorFunctionality가 VectorData의 c'tors 모두를 상속한다. VectorFunctionality에 많은 c'tors를 작성하는 것을 피하기 위해 std :: array에 대해 다른 c'tors를 작성하고 std :: vector에 대해 다른 c'tors를 작성하는 것을 피하십시오.

+2

컴파일러가 C++ 11의 생성자 상속을 지원한다면, 아마도'private' 상속을 사용하고, 생성자를 상속받습니다. 면책 조항 : 아직 시도하지 않았습니다. –

+0

부주의하게 그렇게 쓰면,'std :: is_constructible

+0

은'VectorFunctionality (Args && ... args)'를 사용하여 암시 적으로 인수를 전달합니다. 일반적인 경우에는 이것이 좋고 간단한 API를 제공하지 않는다고 생각합니다. –

답변

1

variadic 생성자가 원하지 않는 것들과 실수로 일치 할 수 있으므로 약간주의해야합니다.

는 다음 코드 (테스트되지 않은) 부분을 보자

VectorFunctionality<int> vf1; 
VectorFunctionality<int> vf2(vf1); // Unintentionally calls the templated constructor 

가에서 const가 아닌 const가 필요하지 않기 때문에 VectorFunctionality에 const가 아닌 참조의 가변 생성자가 더 나은 경기를 감안할 때 변환이므로 복사 생성자 대신 호출됩니다.

VectorFunctionality(VectorFunctionality& that) : VectorFunctionality(static_cast<VectorFunctionality const&>(that)) {} 

참고 :이 특정 문제를 해결

한 가지 방법은 같이 다른 생성자를 추가하는 것입니다 예를 들어이 문제의 다른 표현은 (거기 당신은 무엇을 VectorFunctionality에서 파생 된 인스턴스가있는 경우 ?).

+1

복사 생성이 생성자 템플릿과 일치하지 않는 경우 : 위의 코드는 [defaulted] 복사 생성자를 호출합니다. 사용자가 생성자의 사용을 쉽게 이해하지 못합니다. 템플릿 생성자를 호출하더라도 실제로는 올바른 작업을 수행합니다. 즉, 호출을 구성원에게 전달합니다. –

+0

직접 참조 연결은 파생 - 기반 변환을 제외하고는 완전 일치이므로 cv- 자격은 중요하지 않습니다. OP의 ctor 템플릿에 해당하지 않는 두 개의 참조 바인딩을 비교하는 경우에만 해당됩니다. 여기에는 2 개의 일치 항목이 있지만 하나의 템플릿과 하나의 비 템플릿이 있으므로 비 템플릿이 선택됩니다. – dyp

+2

@ DietmarKühl * "복사 생성물이 생성자 템플릿과 일치하지 않습니다."* 확실하지 않습니다. ctor 템플릿은 결코 복사 또는 이동 ctor로 간주되지 않지만'const &'AFAIK를 사용하는 관용적 copy-ctor보다 더 나은 일치로 과부하 해결을 통해 선택할 수 있습니다. 이를 위해서는 두 가지 모두 참조해야합니다. [라이브 예제] (http://coliru.stacked-crooked.com/a/2046bb2278ff6896) – dyp

관련 문제