0

我无法在监视窗口中查看某些 std::map。查看 .natvis 文件,std::map 有多种实现。有没有办法选择一个或另一个?

https://developercommunity.visualstudio.com/content/problem/1056550/im-unable-to-inspect-a-variable-of-type-stdmap-in.html

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <set>
#include <memory>

typedef std::shared_ptr<std::string> PTR_STRING;
typedef std::map<PTR_STRING, std::size_t> accessFunction2Order;
typedef std::set<accessFunction2Order> setOfAccessFunction2Order;
typedef std::map<std::vector<std::size_t>, setOfAccessFunction2Order> A2B;
typedef std::map<PTR_STRING, std::shared_ptr<A2B> > MAP;

int main()
{   MAP s{
        {    std::make_shared<std::string>("asdasdasdasdasdasdasdasdasdasd"),
            std::make_shared<A2B>()
        }
    };
    const auto &r1 = *s.begin();
}

地图 s 不能被观看(关于 std::_Tree<> 正在显示的东西)。奇怪的是可以引用第一个元素。

4

1 回答 1

0

该问题是由 Visual Studio 调试器中的(我认为是硬编码的)限制引起的。为了显示一个变量,调试器正在调整他在 .natvis 文件中找到的内容——但在尝试了一些固定次数的解析类型后他放弃了。

这个问题的解决方案是使用类似 std::any 的东西

(或 boost::any 对于我们这些无法使用最新 C++ 版本的人来说)

将此 STL 类型分解为调试器可以处理的块。这当然只是一种解决方法。让我们希望这个问题能尽快得到解决。

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <set>
#include <any>
#include <memory>

typedef std::shared_ptr<std::string> PTR_STRING;
typedef std::map<PTR_STRING, long> accessFunction2Order;
typedef std::set<accessFunction2Order> setOfAccessFunction2Order;
#if 1
typedef std::map<std::vector<std::size_t>, std::any> A2B;
#else
typedef std::map<std::vector<std::size_t>, setOfAccessFunction2Order> A2B;
#endif
typedef std::map<PTR_STRING, std::shared_ptr<A2B> > MAP;
typedef std::shared_ptr<std::size_t> PTR_INT;

int main()
{   const MAP s{
        {        std::make_shared<std::string>("asdasdasdasdasdasdasdasdasdasd"), 
             std::make_shared<A2B>()
        }
    };
}
于 2020-05-29T20:36:02.933 回答