C++ 令人难忘的工厂和多层次的继承和分层

C++ 令人难忘的工厂和多层次的继承和分层,c++,c++17,C++,C++17,我一直在试验这里描述的工厂实现: 该示例使用“Animal”作为基类,“Dog”和“Cat”作为在工厂注册的派生类。但是现在假设我想添加一个从Cat派生的“Lion”类。。。在动物工厂注册时,我如何从Cat中获得信息?此外,我还希望能够创建一个“猫”工厂,让我创建类型为“猫”而不是“动物”的对象。这个例子能适应这样做吗 下面是一些基于原始帖子的代码,展示了我正在尝试做的事情 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 模板 阶级工厂 { 公众: 巴塞特朋友; 模板

我一直在试验这里描述的工厂实现:

该示例使用“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
类型。它更详细一些,但我现在可以使用具有多个继承级别的工厂