从字符串中生成某种类型

时间:2016-04-07 11:51:02

标签: c++ string types

Class World旨在产生Actors 演员可以是不同的类型:它可以是Cat,可以是Dog,可以是Tree,一切,唯一类似的东西是它们都来自Actor。
还有命令行,它给世界一个字符串写下一些东西:
what_to_do string_leftover。如果what_to_do等于“Spawn”,那么string_leftover的第一个单词必须是类型名称,第二个 - 演员名称。
问题是Actors的数量可能是无限的 - 我不确定他们的数量,我真的很害怕忘记手动编写他们的Spawn重载。

如果非常简单:
我进入控制台:“SelectWorld World1”然后“Spawn PhysicalPendulum OneMorePendulum”。这将选择名为World1的世界(这是完美的工作)并产生名称为OneMorePendulum的PhysicalPendulum类型的Actor。 问题:我无法优雅地确定我应该从字符串中产生什么类型 为什么:
我所知道的所有解决方案都需要创建“字符串到类型确定器”而不是在actor派生类头/目标文件中 我的意思是我可以使用switch(指向函数的映射),但每次我创建新的Actor类型时我都需要返回到Spawn函数并将新类型写入spawnables,我可能会完全忘记它和looooooong的调试时间将等待我 我可以使用宏创建静态类实例,但不能保证在此实例初始化之前将创建Spawner 我考虑过使用宏的技巧,但它们无法扩展,就像某些定义有“definition_body”一样,我不能在其中添加“another_definition_body”并获得“definition_body another_definition_body”。
我怎样才能从字符串中优雅地生成类型?

2 个答案:

答案 0 :(得分:0)

要创建对象的代码,您必须知道要创建的对象的类型。在某些时候你必须说thing* = new Thing() 您可以拥有一个知道允许创建的所有对象类型的工厂。如果使用标准化命名约定,则可以使用标记粘贴。 thing* = new Thing ## string_name。即string =" Robot"。 #define ABC(name)返回新的Thing ##名称。 class ThingRobot {};等...

答案 1 :(得分:0)

声明一个全局函数/宏,它将新创建的类“注册”到已知的列表中。

//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();})