使用C++,我正在尝试创建一个通用的容器类来处理多种数据类型.这是各种解决方案的常见问题,但我发现没有任何直觉,因为我已经习惯于像Python甚至VB/VBA这样的语言......
所以这是我的情景:
我已经构建了一个基于boost :: any的DataContainer类,我用它来存储多个元素的多种数据类型.我使用声明为的地图:
std::map<std::string, DataContainer* (or DataContainerBase*)>
Run Code Online (Sandbox Code Playgroud)
其中DataContainer是一个封装类型对象的类:
std::list<boost::any>
Run Code Online (Sandbox Code Playgroud)
以及用于管理/访问列表的便利功能.
但是,最后,我仍然被迫在数据容器外进行类型转换.
例如,如果我要在地图中存储一个int值列表,那么访问它们将需要:
int value = boost::any_cast<int>(map["myValue"]->get());
Run Code Online (Sandbox Code Playgroud)
我宁愿将boost代码完全包含在数据容器结构中,所以我只需要输入:
int value = map["myValue"]->get();
Run Code Online (Sandbox Code Playgroud)
或者,最坏的情况:
int value = map["myValue"]->get<int>();
Run Code Online (Sandbox Code Playgroud)
当然,我可以枚举我的数据类型并执行以下操作:
int value = map["myValue"]->get( TYPE_INT );
Run Code Online (Sandbox Code Playgroud)
或编写特定于类型的get()函数:
getInt(), getString(), getBool() ...
Run Code Online (Sandbox Code Playgroud)
最后两个选项的问题是它们有些不灵活,要求我明确声明我希望存储在容器中的每个类型.any_cast解决方案(我已经实现和工作)我认为很好,它只是......不优雅?我不知道.我似乎不需要在外部使用内部机制.
正如我所看到的,传递值而不在DataContainer成员函数的调用中声明值类型将需要一个void*解决方案(由于显而易见的原因这是不可取的),并且需要使用"get()"调用(到目前为止)我可以告诉)在基类级定义的"虚拟模板"成员函数,当然是不允许的.
事实上,我有一个可行的解决方案,实际上,我在这种情况下的使用范围有限,大多数解决方案都能正常运行.但我想知道是否有一种更灵活的方式来管理通用的多类型数据容器.
好吧,我有一个问题,我不知道如何解决。
首先,回顾一下历史:
我从上游拉取更改,并将它们与我正在工作的分支合并。当时,我可能一直在使用具有 root 访问权限的控制台窗口。我这么说是因为我注意到一天后我无法保存到本地存储库中的很多文件。我注意到所有者/组已更改为 root,权限为 644。在检查并查找所有搞砸的文件后,我将所做的一些更改推送回我的远程工作分支。
一周后(现在),我从远程分支向开放拉取请求添加了其他几个提交。其中中间是我在修复本地存储库文件权限后所做的提交。我注意到它有大约 1200 个“空”文件(没有变化)。我有点担心将这个拉取请求合并到上游可能会导致大问题,而且我不知道如何删除这个提交,或者是否有可能......
我尝试创建一个新分支并使用cherry-pick来获取除一个提交之外的所有分支,但我已经删除了文件,并且无法合并旧的提交,这些旧的提交在当时存在的文件和当前存在的文件之间存在“冲突”。本地仓库中不再存在...
无论如何,有什么想法吗?