【问题标题】:factory of templated class模板类工厂
【发布时间】:2016-09-30 12:59:46
【问题描述】:

我不确定如何在 c++ 中完成此操作,但我想阻止我的库的用户在我从他们的插件请求某种利用我的核心库的对象时提供单例对象。我尝试了很多变体,但这是我目前在 C++ 模板工厂中实现的尝试。

问题作为 cmets 嵌入 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
}

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

【问题讨论】:

  • 要么使用工厂方法设计,要么使用模板类进行设计,但不能同时使用两者。工厂方法应该允许您通过提供最少的参数来创建继承和注册的对象。
  • 您的代码(添加了缺少的代码)works 非常好。

标签: c++ plugins factory


【解决方案1】:

如果你想编译时捕获:

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

【讨论】:

  • Trevir 和 UKMonkey 的答案都很好用。我希望我能同时接受。
  • 再仔细看看... template class FooProvider : public IFooProvider { std::shared_ptr getProvidedFoo() { return std::make_shared( ); } } 只需要 1 行 :)
【解决方案2】:

希望这会有所帮助:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多