У меня есть несколько определений, как показано ниже:
class guid_typ;
static const guid_typ one {1};
static const char* sOne = "One Item";
static const guid_typ two {2};
static const char* sTwo = "Two Item";
...
Мои требования :
- Во время отладки, когда я нахожусь в точке останова, я хочучтобы иметь возможность идентифицировать one по его имени, sOne , в окне просмотра по крайней мере.
- Для регистрации во время выполнения, когда функция получает объект один , я хочу записать, скажем, sOne получено
- Одно место (исходный файл), где такое сопоставление существует и является частью библиотеки DLL.
Мои ограничения :
- Я не могу изменить тип guid_typ
- Я не могу обернуть тип, guid_typ , чтобы создать новый тип, скажем, my_guid_typ .Это будет мой предпочтительный способ, но этот тип используется как минимум в 1000 источниках, если не больше.Поэтому я не хочу пытаться сделать это сейчас.Усилия по интеграции огромны.
Моя реализация :
Я выполнил следующее, чтобы выполнить оба требования
std::map<unsigned int, const char*>& GetRpmItemMap()
{
static std::map<unsigned int, const char*> rimap =
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" },
{ 4, "Four" },
{ 5, "Five" },
};
return rimap;
}
extern "C" __declspec( dllexport ) const char* RI_NAME(unsigned int in)
{
const char* val = [&]() {
auto& m = GetRpmItemMap();
auto it = m.find(in);
if (it == m.end())
return "Nothing found";
else
return it->second;
}();
return val;
}
Текущее состояние :
Я могу вызвать эту глобальную функцию в окне просмотра VS отладчика.Это не элегантно, но работает.
GetItemName(1) returns "One"
definitions.dll!GetItemName(4) returns "Four"
Но время от времени я вижу, что он падает в реализации std :: map.И это то, что меня озадачивает, так как я только читаю карту.
Вопрос :
Почему происходит сбой?Что мне здесь не хватает?
Какой ваш предпочтительный подход, учитывая мои требования и ограничения?