클래스 템플릿의 계층 구조가 있습니다. 계층 구조 맨 위에는 추상 기본 클래스 (인터페이스)가 있습니다. 런타임까지 인스턴스화 할 구체 구현을 알 수 없으므로 팩토리 패턴을 사용하는 완벽한 상황 인 것 같습니다. 그러나 C++에서는 가상 멤버 함수 템플릿을 사용할 수 없습니다.C++의 공장 패턴 및 클래스 템플릿
C++에서 아래와 비슷한 합법적 인 디자인을 어떻게 얻을 수 있습니까?
구체적인 공장뿐만 아니라 IProduct 인터페이스의 개별 구체적인 구현은 여러 동적 라이브러리에 있으며 하나 이상의 런타임은 런타임에로드됩니다.
template<class T> class IProduct
{
public:
virtual void doWork(const T & data) = 0;
};
template<class T> class ProductA : public IProduct<T> {/*...*/};
template<class T> class ProductB : public IProduct<T> {/*...*/};
class IProductFactory
{
public:
template<class T> virtual IProduct<T> * createProduct() = 0;
};
class ProductAFactory: public IProductFactory
{
public:
template<class T> virtual IProduct<T> * createProduct()
{
return new ProductA<T>;
}
};
class ProductBFactory: public IProductFactory
{
public:
template<class T> virtual IProduct<T> * createProduct()
{
return new ProductB<T>;
}
};
템플릿 매개 변수를 어떻게 사용합니까? 표시된 것처럼, 그냥 자핑을 해야하는 것 같습니다. – zwol
@Zack에서는 템플릿 매개 변수가 인터페이스 기능 중 하나의 매개 변수 유형으로 사용됩니다. 나는 분명히 할 것이다. –
설명과 같이 인스턴스화 문제를 묻습니다. 누군가 주 프로그램에서 요구하는 모든 T에 대해'ProductA :: doWork','ProductB :: doWork' 등을 인스턴스화해야합니다. ProductA, ProductB , etc가 공유 라이브러리에 숨어 있다면 그렇게 할 수 없습니다. –
zwol