2013-05-21 3 views
2

나는 많은 파생 클래스가있는 기본 클래스를가집니다. 그러나 내 프로그램의 컨테이너에 저장된 기본 클래스에 대한 포인터이므로 가상 함수를 반복하여 호출 할 수 있습니다.파생 클래스의 팩토리 메서드에 대한 템플릿 사용

이 컨테이너에 기본 클래스 포인터를 추가하는 또 다른 클래스가 있으므로 파생 클래스가 new ed (누드이 아님) 일 때 반환하거나 기본 클래스 포인터로 저장해야합니다.

나는 나를 위해이 작업을 수행하는 간단한 기본 클래스 공장 방법을 생각했다

사용하여 템플릿 :

template<class T> //T is the derived class 
    static T* Factory(){ 
     return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T)); 
    } 

나는 두 가지 장점/단점 참조 :

가 장점 : 할 필요가 없습니다를 파생 클래스마다이 값을 무시하십시오.

단점 : T 내베이스에서 파생되지 않은 클래스 유형을 전달하면 잘못 사용될 수 있습니다.

이 함수 내에서 T을 파생시킬 수있는 방법이 있습니까? Factory? 또는 컴파일러가 T이 파생되지 않은 인스턴스를 잡을 것으로 기대할 수 있습니까?

이 일반적인 접근 방식은 수용 가능한 아이디어입니까 아니면 더 좋은 대안이 있습니까?

+1

'T *'를 반환하는 함수가 필요하지 않습니다. 'BaseType * '을 반환하지 않겠습니까? – juanchopanza

+0

@juanchopanza 왜냐하면 파생 클래스에서 함수를 호출하기를 원하기 때문에 파생 클래스에 대한 포인터와 컨테이너가 가상 기본 클래스 함수를 반복 할 때 수행 할 작업이 필요합니다. – johnbakers

답변

2

T가이 함수 내부에서 파생된다는 것을 보장 할 수있는 방법이 있습니까?

functionThatAddsBaseClassPointerToContainerBase* 인 경우 이미 완료되었습니다.

Base* functionThatAddsBaseClassPointerToContainer(Base* b); // <-- 

template<class T> //T is the derived class 
static T* Factory(){ 
    // if T was not derived from Base, the following line fails to compile: 
    return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T)); 
} 
0

std::is_base_of을 사용하여 컴파일 타임에 확인할 수 있습니다.

말했다되고 그건
#include <type_traits> 

template <typename T> 
static T* Factory() 
{ 
    static_assert(std::is_base_of<Base, T>::value, 
       "Error: template parameter T in Factory is not derived from Base"); 
    return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T)); 
} 

은 일반적으로 공장 기능은 인터페이스 유형이 아닌 파생 된 형식을 반환하므로이 경우에 당신의 디자인은 조금 이상하다 :베이스 클래스 Base라고 가정하면.

+0

컨테이너가 필요하면 이상하지 않습니다. 'functionThatAdds'를 사용하여 기본 클래스 포인터를 저장하지만 Factory에 의해 반환 된 파생 포인터를 저장해야하므로 파생 함수를 독립적으로 사용할 수 있습니다. – johnbakers

관련 문제