C++ 令人难忘的工厂和多层次的继承和分层
我一直在试验这里描述的工厂实现: 该示例使用“Animal”作为基类,“Dog”和“Cat”作为在工厂注册的派生类。但是现在假设我想添加一个从Cat派生的“Lion”类。。。在动物工厂注册时,我如何从Cat中获得信息?此外,我还希望能够创建一个“猫”工厂,让我创建类型为“猫”而不是“动物”的对象。这个例子能适应这样做吗 下面是一些基于原始帖子的代码,展示了我正在尝试做的事情C++ 令人难忘的工厂和多层次的继承和分层,c++,c++17,C++,C++17,我一直在试验这里描述的工厂实现: 该示例使用“Animal”作为基类,“Dog”和“Cat”作为在工厂注册的派生类。但是现在假设我想添加一个从Cat派生的“Lion”类。。。在动物工厂注册时,我如何从Cat中获得信息?此外,我还希望能够创建一个“猫”工厂,让我创建类型为“猫”而不是“动物”的对象。这个例子能适应这样做吗 下面是一些基于原始帖子的代码,展示了我正在尝试做的事情 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 模板 阶级工厂 { 公众: 巴塞特朋友; 模板
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
模板
阶级工厂
{
公众:
巴塞特朋友;
模板
静态std::shared_ptr create(const std::string&name、T&……args)
{
尝试
{
返回类型().at(name)(std::forward(args)…);
}
捕捉(标准:超出范围e)
{
抛出std::runtime\u错误(“type\”“+name+”\“未在工厂注册”);
};
};
模板
结构注册器:BaseT
{
公众:
朋友T;
静态布尔寄存器类型()
{
auto-demangle=[](常量字符*名称)->std::string
{
int status=-4;
std::unique_ptr res{abi::ucxa_demangle(name、NULL、NULL和status),free};
return(status==0)?res.get():name;
};
const auto name=demangle(typeid(T).name());
std::cout我在register
类中删除了Base
中的继承,从而稍微调整了factory类。我更改了以下内容:
template <class T> struct Registrar : Base {
模板结构注册器:基本{
为此:
template <class T> struct Registrar
模板结构注册器
回到上面的例子,我现在使用工厂,如下所示:
struct Animal
{
virtual void speak() = 0;
virtual ~Animal() = default;
};
using AnimalFactory = Factory<Animal>;
struct Cat : public Animal, public AnimalFactory::Registrar<Cat>
{
<snip>
};
struct Lion : public Cat, public AnimalFactory::Registrar<Lion>
{
<snip>
};
结构动物
{
虚拟void speak()=0;
virtual~Animal()=默认值;
};
使用AnimalFactory=工厂;
结构猫:公共动物,公共动物工厂::注册人
{
};
结构狮子:公共猫,公共动物工厂::注册商
{
};
主要的区别是,现在每个类都必须派生自Animal
类或子类以及AnimalFactory::register
类型。它更详细一些,但我现在可以使用具有多个继承级别的工厂