从字符串派生特定类型
Spawn certain type from string
类世界是为生成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{};等等。
- 存储模板类型以强制转换回派生<T>
- 在 C++ 中用派生类型重写成员函数
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 在 C++ 中将对象转换为派生类型
- 如何检查派生类的类型?(C++实例)
- 创建派生自可变参数模板包的类型元组
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 返回派生类型时出现协变类型错误
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- (C++);动态决定函数的类型(派生类)
- 如何使variadic模板类方法以函数指针为参数,类型派生自函数模板
- 如何防止从 c++03 中的类型派生
- 如何为从特定类型派生的类型专门化模板
- 为什么在返回从函数的返回类型派生的类型本地对象时不选择 move 构造函数?
- 如何在模板类型中强制静态成员初始化?或如何获取从模板类型派生的所有类的计数
- 有没有任何方法可以从C++中的成员指针类型派生对象类型
- 在c++中基于另一个变量类型派生一个变量类型