为什么重新构建的地图类型与原始地图类型不同?

Dr.*_*pel 6 c++ types

考虑以下代码:

#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)

这将产生以下输出:

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
Run Code Online (Sandbox Code Playgroud)

为什么“重建的”地图类型与简单的地图类型不同,尽管两者都具有相同的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)

eer*_*ika 5

testmap::value_type::first_typeconst int而不是int

您可以改用testmap::key_type正确的类型。基于对类型,不可能区分const和非const键类型。就是说,const键不能满足的要求std::map,因此您可以简单地假设它是非const并从中删除const testmap::value_type::first_type


Nat*_*ica 5

这是因为std::map::value_typestd::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)