2016-09-30 7 views
1

나는 C++에서 이것을 수행하는 방법을 모르지만, 내 핵심 라이브러리를 활용하는 플러그인에서 특정 종류의 객체를 요청할 때 내 라이브러리 사용자가 싱글 톤 객체를 제공하지 못하도록하고 싶습니다. 나는 많은 변형을 시도했지만, 이것은 C++의 템플릿 공장에서의 구현에 대한 나의 현재의 시도이다.템플릿 기반 팩토리

질문은 FooProvider.h 스텁에 주석으로 포함됩니다. 감사!

template <typename T> 
class FooProvider : public IFooProvider 
{ 
    static_assert(std::is_convertible< T*, IFoo* >::value, 
        "Interface needs to be of type IFoo"); 

    std::shared_ptr<IFoo> getProvidedFoo() 
    { 
     std::shared_ptr<IFoo> rtn = 
      static_pointer_cast<IFoo> (std::make_shared<T>()); 
     return rtn; 
    } 
} 
+0

팩토리 메서드 또는 템플릿 클래스 중 하나만 사용하여 디자인 할 수 있지만 둘 다 사용할 수는 없습니다. 팩토리 메소드를 사용하면 최소한의 매개 변수를 제공하여 계승 된 오브젝트 및 등록 된 오브젝트를 작성할 수 있습니다. – seccpur

+1

코드가 누락되었습니다. [works] (http://cpp.sh/8mx6i). –

답변

0

당신이 끄는 시간을 컴파일하려면 :

/* 
* IFooProvider.h 
*/ 
//Interface - Factory for different variations of IFoo 
class IFooProvider 
{ 
    virtual std::shared_ptr<IFoo> getProvidedFoo(); 
} 

//=========================================================================== 

/* 
* FooProvider.h 
*/ 
template <typename T> //Not sure how to enforce that T is derived from IFoo? 
class FooProvider : public IFooProvider 
{ 
    std::shared_ptr<IFoo> getProvidedFoo() 
    { 
     //This doesn't work. 
     //Not sure how to perform this cast or if this is even possible? 
     std::shared_ptr<IFoo> rtn = std::make_shared<T>(); 
     return rtn; 
    } 
} 

//=========================================================================== 

//Other team's implementation version. Exists in a different library that I have no control over. 

/* 
* MyFooProvider.h 
*/ 
class MyFooProvider : public FooProvider<MyFoo> 
{ 
    //Nothing really going on here. Just want to implement a provider for MyFoo 
} 

//=========================================================================== 
+0

Trevir과 UKMonkey 모두 답변으로 작동하며 훌륭합니다. 나는 둘 다 받아 들일 수 있으면 좋겠다. 조금 더 밀접하게 그것을보고 – Klobersaurus

+0

... 템플릿 클래스 FooProvider : 공공 IFooProvider { 표준 : : shared_ptr의 getProvidedFoo() { 반환 표준이 :: make_shared(); } } 줄 하나만 있으면됩니다. :) – UKMonkey

0

희망이 도움이

template <typename T> 
class FooProvider : public IFooProvider 
{ 
    std::shared_ptr<IFoo> getProvidedFoo() 
    { 
     std::shared_ptr<T> rtn = std::make_shared<T>(); 
     return rtn; 
    } 
} 

없음 캐스팅이 필요하지 않으며, T는 IFoo를 확장하지 않으면 당신은 컴파일을 얻을 것이다 'rtn'을 std :: shared_ptr에서 std :: shared_ptr로 변환 할 수 없다는 오류가 발생했습니다. 아주 명백한 오류 메시지입니다.