考虑以下代码:
#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";
}
Run Code Online (Sandbox Code Playgroud)
这将产生以下输出:
Run Code Online (Sandbox Code Playgroud)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
为什么“重建的”地图类型与简单的地图类型不同,尽管两者都具有相同的value_type?背景:我想测试包含对的容器是否为地图,是否具有类似的构造
std::is_same<std::map<typename Container::value_type::first_type,
typename Container::value_type::second_type>,
Container>::value
Run Code Online (Sandbox Code Playgroud)
testmap::value_type::first_type是const int而不是int。
您可以改用testmap::key_type正确的类型。基于对类型,不可能区分const和非const键类型。就是说,const键不能满足的要求std::map,因此您可以简单地假设它是非const并从中删除const testmap::value_type::first_type。
这是因为std::map::value_type是std::pair<const Key, Value>,没有std::pair<Key, Value>。这样做的原因是,永远不允许您修改映射中的一对密钥。
要使重建的地图与使用相同,value_type::first_type您需要const使用std::remove_const_tlike 删除
typedef std::map<std::remove_const_t<typename testmap::value_type::first_type>, typename testmap::value_type::second_type> rebuiltMap;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |