模板化类的工厂
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;
}
}
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- 注册对对象工厂的调用会导致段错误
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- 在基类中编写工厂方法
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- 抽象工厂结构的差异
- 编写可测试的代码 - lambda 函数和unique_ptr中的basic_istream工厂
- 下面抽象工厂设计模式的实现是正确的吗
- 没有用于初始化模拟工厂的匹配构造函数
- 从工厂方法返回的ComPtr的引用计数增加两次