Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板映射。。我们可以吗?_C++_Templates_Maps - Fatal编程技术网

C++ 模板映射。。我们可以吗?

C++ 模板映射。。我们可以吗?,c++,templates,maps,C++,Templates,Maps,我想创建一个容器(最好是映射),其中包含离散类型的值: KEY Value Omega 1.9 Output myoutput.out sizex 82 ##### ### 其中键为=“std::string”,值为“INT/DOUBLE/string” 我试着宣布一些类似的事情 template<typename T> map<string, typename T> mymap; 模板 地图我的地图; 但肯定不

我想创建一个容器(最好是映射),其中包含离散类型的值:

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
#包括
使用名称空间std;
联合类型{
INTC;
双i;
char*c;
} 
int main()
{
映射对象;
}
更多关于

#的信息包括
使用名称空间std;
联合类型{
INTC;
双i;
char*c;
} 
int main()
{
映射对象;
}

关于

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


或者,您可以使用变体类型(boost variant)或类型擦除(boost any)来使用一个容器来处理不同的类型。如果您不能使用boost,实现一些简单的类型擦除并没有那么复杂,但除非您真的需要,否则我不会使用它(也就是说,比起您自己的方轮,您更喜欢预罐装的货架上的解决方案)

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


或者,您可以使用变体类型(boost variant)或类型擦除(boost any)来使用一个容器来处理不同的类型。如果您不能使用boost,实现一些简单的类型擦除并没有那么复杂,但除非您真的需要,否则我不会使用它(也就是说,比起你自己的方轮,你更喜欢一个预先封装的现成解决方案)

你可以尝试使用Boost.variant作为映射类型。但是你确定你真的需要一个
映射吗?也许一个
数据类型
?使用一个新的库“Boost.variant”有点麻烦。无论如何,映射不是唯一的东西。我想使用容器中相应“键”的“值”,用于进一步计算,因为映射给出O(N)--(N--元素数)内的结果我决定使用映射。通过将
int
double
存储为二进制值而不是字符串,您真正实现了什么?它看起来像一个配置文件,性能重要吗?只需在从映射检索时反序列化这些值,并断言数字转换有效。您可以尝试将Boost.variant作为mappe但是你确定你真的需要一个
map
?也许使用一个新的库“Boost.variant”的
data\u type
有点麻烦,我想。无论如何,map不是唯一的东西。我想用容器中相应的“key”的“value”进行进一步的计算,因为map在(N) --(N--元件数量)我决定使用映射。通过将
int
double
存储为二进制值而不是字符串,您真正实现了什么?它看起来像一个配置文件,性能重要吗?只是在从映射检索时反序列化值,并断言数值转换有效。@Jason您说得对,我的错。我写了这个离开编辑器。但我的观点是无效的。这种方法有一个可怕的副作用,就是强迫您管理存储在联合中的内存(即,要存储字符串,您需要动态分配内存,然后在运行结束时需要遍历映射并调用
delete[]
在那些活动成员为
字符的元素上,但如果活动成员是其他任何元素,则不适用于这些元素……我宁愿远离这种复杂性。@DavidRodríguez dribeas我同意你的观点,但要解决这个问题,你可以始终使用智能指针。不,你不能也不应该。如果你可以使用智能指针,你也应该使用智能指针如果能够使用
std::string
,那么就不需要智能指针。但是C++03中的联合只允许POD类型,而C++11中的联合允许任何类型,但您仍然需要手动管理联合的活动成员的生存期,这本身就迫使您跟踪存储的类型…如果您要使用do首先,使用变体(boost变体,甚至是您自己的变体)或类型擦除(boost any)@厄运你可以使用地图,然后你可以通过它的大小来判断类型。@Jason你说的对,我的错。我在编辑器上写下了这一点。但我的观点是无效的。这种方法有一个可怕的副作用,那就是强迫你管理存储在联合体中的内存(即,要存储字符串,需要动态分配内存,然后需要在运行结束时遍历映射并调用
delete[]
在那些活动成员为
字符的元素上,但如果活动成员是其他任何元素,则不适用于这些元素……我宁愿远离这种复杂性。@DavidRodríguez dribeas我同意你的观点,但要解决这个问题,你可以始终使用智能指针。不,你不能也不应该。如果你可以使用智能指针,你也应该使用智能指针如果能够使用
std::string
,那么就不需要智能指针。但是C++03中的联合只允许POD类型,而C++11中的联合允许任何类型,但您仍然需要手动管理联合的活动成员的生存期,这本身就迫使您跟踪存储的类型…如果您要使用do首先,使用变体(boost变体,甚至是您自己的变体)或类型擦除(boost
#include <map>

using namespace std;


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

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