Почему этот std :: map не отображается в окне просмотра Visual C ++ в удобном для использования виде? - PullRequest
0 голосов
/ 29 мая 2020

Я не могу просмотреть некоторые 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();
}

Невозможно просмотреть карту (что-то относительно std :: _ Tree <> отображается). Любопытно, что ссылка на первый элемент может.

1 Ответ

0 голосов
/ 29 мая 2020

Проблема вызвана (я думаю, жестко заданным) ограничением в отладчике 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>()
        }
    };
}
...