考虑以下代码:
#include <iostream>
#include <typeinfo>
#include <map>
int main(int argc, const char* argv[]) {
typedef std::map<int,float> testmap;
typedef std::map<int,float> testmap2;
typedef std::map<typename testmap::value_type::first_type, typename testmap::value_type::second_type> rebuiltMap;
std::cout << "map samenes: " << std::is_same<testmap, rebuiltMap>::value << "\n";
std::cout << "map samenes: " << std::is_same<testmap, testmap2>::value << "\n";
std::cout << "original map type name " << typeid(testmap).name() << "\n";
std::cout << "same map type name " << typeid(testmap2).name() << "\n";
std::cout << "rebuilt map type name " << typeid(rebuiltMap).name() << "\n";
std::cout << "original map valuetype " << typeid(testmap::value_type).name() << "\n";
std::cout << "rebuilt map valuetype " << typeid(rebuiltMap::value_type).name() << "\n";
}
这将产生以下输出:
map samenes: 0 map samenes: 1 original map type name St3mapIifSt4lessIiESaISt4pairIKifEEE same map type name St3mapIifSt4lessIiESaISt4pairIKifEEE rebuilt map type name St3mapIKifSt4lessIS0_ESaISt4pairIS0_fEEE original map valuetype St4pairIKifE rebuilt map valuetype St4pairIKifE
为什么“重建的” map 类型与简单的 map 类型不同,尽管两者都具有相同的value_type?
背景:我想测试包含对的容器是否为 map ,是否具有类似的构造
std::is_same<std::map<typename Container::value_type::first_type,
typename Container::value_type::second_type>,
Container>::value
最佳答案
这是因为std::map::value_type
是std::pair<const Key, Value>
,而不是std::pair<Key, Value>
。这样做的原因是,永远不允许您修改映射中的一对 key 。
要使用value_type::first_type
使重建后的 map 相同,您需要使用 const
删除该std::remove_const_t
,例如
typedef std::map<std::remove_const_t<typename testmap::value_type::first_type>, typename testmap::value_type::second_type> rebuiltMap;
关于c++ - 为什么重建后的 map 类型与原始 map 类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58879778/