2014-02-16 2 views
0

모든 클래스 생성자 (동일한 기본 클래스 "Base"에서 파생 됨)의 생성자를 생성자 수와 함께 캡슐화 할 수있는 팩토리 클래스를 설계하려고합니다. 인수. 현재의 디자인은 하나 개 또는 제로 생성자 인수를 지원합니다생성자에 대한 가변 템플릿 인수가있는 팩토리 클래스

class FactoryBase 
{ 
public: 
    FactoryBase(std::string id) : id_(id) {} 
    virtual ~FactoryBase(){} 
    virtual Base* create() const = 0; 
    std::string getId() const { return id_; } 
protected: 
    std::string id_; 
}; 

template<class T, typename A> //One argument 
class Factory : public FactoryBase 
{ 
public: 
    Factory(std::string id, A arg) : FactoryBase(id), arg_(arg) {} 
    Base* create() const { return new T(arg_); } 
private: 
    A arg_; 
}; 

template<class T> //zero arguments/default ctor 
class Factory<T,void> : public FactoryBase 
{ 
public: 
    Factory(std::string id) : FactoryBase(id) {} 
    Base* create() const { return new T(); } 
}; 

난 그냥 인수의 각 번호에 대해 하나의 템플릿 특수화를 추가 할 수 있습니다,하지만 나는 그것을 "porperly"하는 방법을 알고 싶습니다.

+0

돌아왔다! :-) – 0x499602D2

+0

그래, "variadric"을 가변적으로 고칠 수 없어서 나를 미치게했다. – jms

+0

기본 클래스의 FactoryBase (id) {}'는': id_ (id)'가 아니겠습니까? – 0x499602D2

답변

0

내가 duplicate에서 제공 한 정보를 사용하여 인수 유형을 유형 목록에 저장해야합니다. C++ 11에서는 std::tuple이 될 것입니다. 클래스 템플릿은이 튜플에 배치 된 인수의 매개 변수 팩을 사용해야합니다.

생성자는 매개 변수 팩을 사용하는 템플릿 생성자 여야하며 튜플 데이터 멤버의 생성자로 전달할 수 있습니다.

컴파일 타임 정수 시퀀스 생성기는 create() 내의 튜플의 각 요소에 액세스하는 데 사용할 수 있습니다 (복제본의 정확한 코드 참조).

+0

생성자 인수에서'Factory' 유형을 추론 할 수 있습니까? 나는 다음을 할 수 있기를 바란다 : Factory 대신에 Factory fac1 ("ID123", "arg0", 1.56, 4) fac2 ("ID123", "arg0", 1.56, 4);'. – jms

+0

물론 'Factory fac1 = makeFactory ("ID123", "arg0", 1.56, 4);와 같은 것은 작동하지만, 일부 외부 함수 대신에 적절한 구문이 깔끔합니다. – jms

+0

@ user1062874 미안하지만 생성자가 작동하려면 형식을 미리 알아야합니다. 이는 튜플 데이터 멤버가 인수를 생성자에 전달하기 전에 지정된 유형을 가져야하기 때문입니다. 이것이 필자가 매개 변수에서 유형을 추론 한 도우미 함수를 제안한 이유입니다. – 0x499602D2

관련 문제