C++中"classes"(非对象)的哈希表
Hash table of "classes" (not objects) in C++
为了我的大学作业,我需要用C++为一种基于函数(或命令)的语言制作一个解释器。解释器必须读取输入文件,提取单词(字符串),生成命令并执行它们。所有命令都是继承自一个公共超类(例如Command
)的类,该类有一个名为execute
的虚拟方法。对于从输入文件中读取的每个单词,都会创建一个命令并将其存储在vector<Command>
中。
因此,我正在考虑使用一个哈希表,它的键是命令(字符串)的名称,其值是某种允许我创建特定类(或允许我访问特定类的构造函数)的对象,以便轻松地为每个单词创建类,而不是使用if-else-if链。
到目前为止,我正计划使用一个名为generate
的虚拟方法创建一个CommandGenerator
类,该方法返回一个新的Command
对象。我的命令哈希表的值将是CommandGenerator
类的对象。因此,我为所有命令派生了许多其他子类,这些子类返回从Command
派生的特定新对象。
但是,类似的东西已经存在了吗?或者还有什么更优雅的方法可以做到这一点吗?有什么类型的对象可以从类中提取出来表示它吗?
如果每个命令都是Command
的子类,为什么不使用std::vector<Command*>
并将指针推送到每个子类的实例?然后,您可以对向量进行迭代,并调用您的虚拟execute
函数。
关于在向量中放置类,最接近的方法是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<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
打印到屏幕上。但是,如果你非常关心速度,那就做很多假设。
您面临的基本问题是:您将类的名称作为字符串,并希望创建一个具有该名称的类。正如你所提到的,这个翻译必须以某种方式手动完成。这已经在这里讨论过好几次了,比如在用工厂模式按名称实例化类中,或者在寻找更好的C++类工厂中。我在这里要做的唯一补充是:使用好的旧宏,因为它们有字符串运算符。例如:
#include <stdio.h>
#define CREATEOBJ(clss,command) if (strcmp (#clss, command)==0) return new clss;
class Base {
public:
virtual const char *name()=0;
};
class A : public Base {
public:
const char *name() {return "I am an A";}
};
class B : public Base {
public:
const char *name() {return "I am an B";}
};
Base *makeInstance (const char *nm) {
CREATEOBJ(A,nm);
CREATEOBJ(B,nm);
}
int main () {
printf ("%sn", makeInstance ("A")->name());
printf ("%sn", makeInstance ("B")->name());
}
当然,你可以通过使用一个包含字符串和一些函数指针或生成器类指针的哈希表来让它变得更好,但想法保持不变:要添加一个新类,只需再添加一个CREATEOBJ即可。
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 查找项目在哈希表中的位置
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 使用哈希表设置实现
- 同时写入和读取哈希表
- C++中"classes"(非对象)的哈希表
- c++中对象的哈希表
- 人对象向量哈希表c
- 正在将对象插入哈希表...出于某种原因不让我?
- 在哈希表中插入一个struct对象