模板化类的工厂

factory of templated class

本文关键字:工厂      更新时间:2023-10-16

我不确定如何在c++中实现这一点,但我想防止我的库的用户在我从利用我的核心库的插件请求某种类型的对象时提供单例对象。我已经尝试了一堆变化,但这是我目前在c++模板工厂实现的尝试。

问题作为注释嵌入到FooProvider.h存根中。谢谢!

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

如果您想要编译时捕获:

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 -一个非常明显的错误消息。

希望对您有所帮助:

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