gpt4 book ai didi

c++ - C++ 中 "classes"(不是对象)的哈希表

转载 作者:行者123 更新时间:2023-11-30 04:22:19 24 4
gpt4 key购买 nike

为了我的大学作业,我需要为基于函数(或命令)的语言编写一个 C++ 解释器。解释器必须读取输入文件,提取单词(字符串),生成命令并执行它们。所有命令都是继承自公共(public)父类(super class)(例如 Command)的类,它有一个名为 execute 的虚方法.对于从输入文件中读取的每个单词,都会创建一个命令并将其存储在 vector<Command> 中.

所以,我正在考虑使用一个哈希表,它的键是命令的名称(字符串),它的值是某种对象,它允许我创建一个特定的类(或者让我访问构造函数一个特定的类),以便轻松地为每个单词创建类,而不是使用 if-else-if 链。

现在,我打算创建一个 CommandGenerator带有一个名为 generate 的虚方法的类它返回一个新的 Command目的。我的命令哈希表的值将是 CommandGenerator 的对象类(class)。所以我从它派生出所有命令的许多其他子类,这些子类返回派生自 Command 的特定新对象。 .

但是,这样的事情已经存在了吗?还是有更优雅的方式来做到这一点?有没有一种对象可以从一个类中提取出来来表示它?

最佳答案

如果每个命令都是Command的子类,你为什么不使用 std::vector<Command*>并将指针推送到每个子类的实例?然后你可以迭代 vector 并调用你的虚拟 execute功能。

关于将类放置在 vector 中的最接近的结果是 boost::fusion::vector .但是不能在运行时填充,对您的特定情况没有用。


假设您可以使用 C++11。如果您可以将命令定义为 execute功能,你可以这样做:

map<string, function<void()>> cmds = {
make_pair("print1", [](){
cout << "1" << end;
}),
make_pair("print2", [](){
cout << "2" << end;
}),
make_pair("print3", [](){
cout << "3" << end;
})
};

然后将命令放在 vector 上:

vector<function<void()>> list;
list.push_back(cmds["print1"]);
list.push_back(cmds["print1"]);
list.push_back(cmds["print2"]);

然后循环执行:

for (function<void()>& cmd : list)
cmd();

这应该打印 112向屏幕。但是,如果您非常在意速度,请改为做很多 ifs。

关于c++ - C++ 中 "classes"(不是对象)的哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com