有没有一种方法可以在不声明值类型的情况下拥有std::map ?
Is there a way to have a std::map without declare the value type
我需要一个std::map
容器,如:
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
-
键
"a1"
的值为另一个std::map
,但键"a2"
的值为整数。在这种情况下,我如何声明地图? -
是否有办法将值更改为另一种类型?例如,如果我想将
"a12"
的值更改为std::vector
?
谢谢。
不,你不能马上这么做。考虑使用某种类型擦除设备,最好是类型安全且易于理解的,比如boost::variant
或boost::any
。否则,您可以创建一个包含不透明堆分配缓冲区(老派void*
)的value
类,并且您应该根据enum
字段的值将其强制转换为类型。
使用std::map时需要指定值类型。如果你想映射到不同类型的对象,我认为你有两种可能:
为值定义基类并声明
std::map<int, base_class_t *>
映射或,最好是
std::map<int, shared_ptr<base_class_t>>
然后你可以插入不同的对象,都是从base_class_t派生的。
另一个选项是映射到联合。但我不会那样做;-)
我没有完全理解你的问题。我得到的是你想要插入不同类型的值。第一个键将包含另一个映射的"int值",该映射的另一个键指向该映射。第二个键将包含一个普通整数。如果是这种情况,为什么不在map中使用vector呢?
std::map<int, std::vector<int>> mymap;
std::vector <int> vec;
vec.push_back(5);
mymap.insert(make_pair(1, vec));
更进一步,如果你不确定数据类型。您还可以使用嵌套映射。对于第二个元素,只需放置一个假键。
std::map<int, std::map<int,int>> mymap;
std::map <int, int> mappy;
mappy.insert(make_pair(0,5));
mymap.insert(make_pair(1, mappy));
这解决你的问题了吗?
不,每个STL容器类型都需要一个确切的类型。对于你的想法,你需要一个可以容纳多种类型的容器类型。你可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
键"a1"的值为另一个std::map,但键"a2"的值为整型。在这种情况下,我如何声明地图?
你不能声明这样的映射。map的所有值具有相同的类型。
是否有办法将值更改为另一种类型?例如,如果我想将"a12"的值更改为std::vector?
你的意思可能是,"有没有办法将变量的类型更改为另一种类型"。答案是否定的
但是,可以定义一个可以将任何类型的数据包含在其中的类型。实现起来并不简单,但是您很幸运,Boost已经实现了这样的类型:boost::any
。具有这种值类型的map可以保存any
-object中包含的任何类型的值。我建议你重新考虑你的设计,这样你就不需要任何类型的对象了。
我认为,可能一个部分模板类与一个参数定义可能是你的问题的答案,像这样;
template <typename T>
class partialMap : public std::map<int,T>
{
};
int main()
{
//vector example
std::vector <int> vec;
partialMap<std::vector<int>> _vecMap;
vec.push_back(5);
_vecMap.insert(make_pair(1, vec));
//map example
std::map<int,int> map;
partialMap<std::map<int,int>> _mapMap;
vec.push_back(5);
_mapMap.insert(make_pair(1, map));
}
因此,您可以使用模糊的相同类,第一个参数预定义,第二个参数在函数中定义,无论您需要什么
- 为什么在这种情况下,bool 类型的输出等于 0?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 如何在没有实例的情况下获取非静态方法的类型?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 将类型映射到整数值后,如何在给定整数值的情况下恢复类型?
- 如何在不违反类型别名规则的情况下解释消息负载?
- msgpack:在不知道类型的情况下解包自定义类
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 为什么在以下情况下不需要为依赖类型使用typename
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- 如何定义可以在没有联合的情况下容纳uintptr_t或uint32_t的类型?
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?