【问题标题】:Template Maps. .. can we?模板地图。 .. 我们可以吗?
【发布时间】:2012-07-22 01:02:47
【问题描述】:

我想创建一个包含离散类型值的容器(最好是地图):

KEY     Value
Omega    1.9  
Output   myoutput.out  
sizex    82  
#####    ###  

其中键是 = "std::string",值是 "INT/ DOUBLE/ String"

我尝试声明类似的东西。

template<typename T>  
map<string, typename T> mymap;  

但确定它不起作用。

:(

我知道有一种简单的方法,将它们分成不同的变量,但这只会导致代码膨胀。我也很清楚这个事实,
std::map&lt;key_value key, class Allocator = allocator&lt;pair&lt;const Key,T&gt;&gt;
编译时需要知道“key”和“value”的信息来生成空间。

但是这个问题困扰了我很长一段时间,只需要对其进行排序:D
有人能帮我看看这个吗:D

【问题讨论】:

  • 您可以尝试将 Boost.variant 作为映射类型。但是你确定你真的需要map吗?
  • 可能是data_type 的Boost.any?
  • 使用“Boost.variant”这个新库,我猜有点麻烦。
  • 无论如何地图不是唯一的东西。我想使用容器中相应“键”的“值”进行进一步计算,并且由于地图在 O(N) 内给出结果——(N——元素数量)我决定使用地图。
  • 通过将int 和double 存储为二进制值而不是字符串,您真正实现了什么?它看起来像一个配置文件,性能重要吗?只需在从地图检索时反序列化值,并断言数字转换有效。

标签: c++ templates maps


【解决方案1】:
#include <map>

using namespace std;


union mytypes_t {
  int c;
  double i;
  char* c;
} 

int main()
{
    Map<int, mytypes_t> myObject;
}

更多关于unions

【讨论】:

  • @Jason 你说得对,我的错。我把这个从编辑器上写下来了。但我的观点仍然有效。
  • 这种方法有一个可怕的副作用,它迫使您管理存储在联合中的内存(即,要存储一个字符串,您需要动态分配内存,然后您需要遍历在运行结束时映射并在活动成员为char* 的那些元素上调用delete[],但如果活动成员是其他任何元素则不调用......我宁愿远离这种复杂性。
  • @DavidRodríguez-dribeas 我同意你的观点,但要解决这个问题,你总是可以使用智能指针。
  • 不,你不能也不应该。如果你可以使用智能指针,你也可以使用std::string,那么就不需要智能指针了。但是 C++03 中的联合只允许 POD 类型,而 C++11 中的联合确实允许任何类型,但您仍然需要手动管理联合的活动成员的生命周期,这本身就迫使您跟踪类型已存储...如果您首先要这样做,请使用变体(增强变体,甚至是您自己的变体)或类型擦除(增强任何)
  • @DOOM 你可以使用 map 然后你可以通过它的大小来判断类型。
【解决方案2】:

正如您提到的,简单的解决方案是将数据分成三个不同的数组并编写一个包装器,该包装器将在适当的容器中找到元素(假设执行查找的代码确实知道变量的类型,否则甚至这变得很复杂)。

或者,您可以使用变体类型(boost 变体)或类型擦除(boost any)来使用将处理不同类型的容器。如果你不能使用 boost,那么实现一些简单的类型擦除并不是那么那么复杂,但我会远离它,除非你真的需要它(即更喜欢预先罐装的您自己的方轮的现成解决方案)

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多