2016-09-30 2 views
1

Я не уверен, как это сделать в C++, но я хочу, чтобы пользователи моей библиотеки не предоставляли объекты singleton, когда я запрашиваю определенный вид объекта из своего плагина, который использует мои основные библиотеки. Я пробовал кучу вариаций, но это моя текущая попытка реализации на шаблонной фабрике в C++.factory templated class

Вопросы вставляются как комментарии в FooProvider.h stub. Благодаря!

/* 
* 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

Либо вы создаете, используя заводские методы или класс шаблонов, но не оба. Метод Factory должен позволять вам создавать наследованные и зарегистрированные объекты, предоставляя минимальные параметры. – seccpur

+1

ваш код (с отсутствующим кодом добавлен) [работает] (http://cpp.sh/8mx6i) очень хорошо. –

ответ

0

Если вы хотите скомпилировать время ловли:

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

Нет необходимость литья, и если Т не распространяется IFoo вы получите компиляции что он не смог преобразовать 'rtn' из std :: shared_ptr в std :: shared_ptr - довольно очевидное сообщение об ошибке.

+0

Оба Trevir и UKMonkey отвечают на вопросы и отлично справляются. Хотел бы я согласиться с тем и другим. – Klobersaurus

+0

Глядя на него чуть более близко ... шаблона класса FooProvider: общественный IFooProvider { станд :: shared_ptr getProvidedFoo() { возвращения станд :: make_shared (); } } 1 линия - это все, что необходимо :) – UKMonkey

0

Надеется, что это помогает:

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; 
    } 
}