从字符串派生特定类型

Spawn certain type from string

本文关键字:类型 派生 字符串      更新时间:2023-10-16

类世界是为生成Actors而设计的
演员可以是不同的类型:可以是猫,可以是狗,可以是树,所有的东西,唯一相似的是他们都源于演员
还有一个命令行,它为World提供了一个字符串,下面写着:
what_to_do字符串剩余。若what_to_do等于"Spawn",那个么字符串剩余部分的第一个单词必须是类型名称,第二个是参与者名称
问题是演员的数量可能是不确定的——我真的不确定他们的数量,我真的很害怕忘记手动编写他们的《重生》过载。

如果非常简单:
我在控制台上输入:"选择世界1",然后是"产生物理钟摆一个又一个钟摆"。这将选择名为World1的世界(这是完美的工作),并产生名为OneMorePendulum的PhysicalPendurum类型的Actor
问题:我不能很好地确定应该从字符串派生出什么类型
原因:
我知道的所有解决方案都需要创建"字符串到类型确定器",而不是在actor派生的类头/对象文件中
我的意思是,我可以使用switch(指向函数映射的指针),但每次我创建新的Actor类型时,我都需要返回到Spawn函数并将新类型写下到spawnables,我可能会完全忘记它,并且等待我的调试时间会很长。
我可以用宏创建静态类实例,但不能保证Spawner会在该实例初始化之前创建
我考虑过宏的技巧,但它们无法扩展,比如如果某个define有"definition_body",我就不能在其中添加"another_definition_body",然后得到"definition_Bodyanother_dedefinition_board"
如何从字符串中优雅地派生类型?

声明一个全局函数/宏,它将把新创建的类"注册"到已知的列表中,例如

//SpawnActor.h
#pragma once
using std::string;
using std::map;
using std::function;
class Actor;
class ActorSpawner
{
public:
    typedef function<Actor()> SpawnFunction;
    static void RegisterActorClass(const string& name, const SpawnFunction& function)
    {
        s_spawnClasses[name] = function;
    }
    void SpawnClass(const string& name)
    {
        // You'll need to validate name
        Actor* a = s_spawnClasses[name]();
        //...
    }
private:
    static map<string, function<Actor()> s_spawnClasses
};

//SpawnActor.cpp
#include "SpawnActor.h"
map<string, function<Actor()> SpawnFunction::s_spawnClasses();

//TreeActor.h
class TreeActor : public Actor
{
    ...
};

//TreeActor.cpp
#include "TreeActor.h"
ActorSpawner::RegisterActorClass("TreeActor", [](){return new TreeActor();})

对于要创建对象的代码,您必须知道要创建的对象的类型。在某个时刻,你必须说thing* = new Thing()您可以拥有一个知道允许创建的所有对象类型的工厂。如果使用标准化命名约定,则可以使用标记粘贴。CCD_ 2。即字符串="机器人"#define ABC(name)return new Thing##name。类ThingRobot{};等等。