c++ - C++ 中多种数据类型的通用容器

标签 c++ boost map containers

我正在尝试使用 C++ 创建一个通用容器类来处理多种数据类型。这是各种解决方案的常见问题,但我发现没有任何东西像我在 Python 甚至 VB/VBA 等语言中习惯的那样……直观……

这是我的场景:

我已经基于 boost::any 构建了一个 DataContainer 类,我用它来存储多个元素的多种数据类型。我使用声明为的 map :

std::map<std::string, DataContainer* (or DataContainerBase*)>

其中 DataContainer 是封装以下类型对象的类:

std::list<boost::any>

以及用于管理/访问列表的便捷功能。

然而,最后,我还是被迫在数据容器之外进行类型转换。

例如,如果我要在 map 中存储一个 int 值列表,访问它们需要:

int value = boost::any_cast<int>(map["myValue"]->get());

我宁愿 boost 代码完全包含在数据容器结构中,所以我只需要输入:

int value = map["myValue"]->get();

或者,最坏的情况:

int value = map["myValue"]->get<int>();

当然,我可以枚举我的数据类型并执行如下操作:

int value = map["myValue"]->get( TYPE_INT );

或编写特定于类型的 get() 函数:

getInt(), getString(), getBool() ... 

最后两个选项的问题是它们有些不灵活,需要我明确声明我希望存储在容器中的每种类型。我认为 any_cast 解决方案(我已经实现并有效)很好,只是……不雅观?我不知道。看来我不应该也需要在外部使用内部机制。

如我所见,在调用 DataContainer 成员函数时传递值而不声明值类型将需要一个 void* 解决方案(由于显而易见的原因,这是不可取的),并且使用“get()”调用将需要(据我所知)在基类级别定义的“虚拟模板”成员函数,当然,这是不允许的。

实际上,我有一个可行的解决方案,实际上,我在这种情况下的使用范围非常有限,大多数解决方案都能很好地工作。但我想知道是否有比这更灵活的方式来管理通用的多类型数据容器。

最佳答案

如果你想为此加点糖:

int value = boost::any_cast<int>(map["myValue"]->get());

那么您可能想让 get() 函数返回一个代理对象,定义 +- 如下:

struct Proxy {
    boost::any& value;
    Proxy(boost::any& value) : value(value) {}

    template<typename T>
    operator T() {
        return boost::any_cast<T>(value);
    }
};

那么这个语法就可以工作了:

int value = map["myValue"]->get();
// returns a proxy which gets converted by any_cast<int>

但是我建议保持明确并只使用该语法:

int value = map["myValue"]->get<int>();

这里的 get 返回的不是一个带有模板方法的代理对象,而是一个模板方法本身(但与上面显示的模板转换运算符的作用相同)。

关于c++ - C++ 中多种数据类型的通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569516/

相关文章:

c++ - 类中的静态变量和内存分配及其使用

c++ - 从类 C++ 返回映射

c++ - 为什么 boost::log 的链接限制

c++ STL map.find() 或 map.operator[] 不能在带有 const 限定符的类成员函数中使用

c++ - 顶点位置/法线/坐标无法正确渲染

C++ Socket recv 未接收到正确的字节数?

c++ - 使用boost::concept_check编译报错

c++ - boost::make_shared() 与模板化类?

map - 如何设置 OpenLayers map 的范围?

c++ - 另一个有序 map 与无序(哈希) map 问题