gvsk Ответов: 2

Сопоставление с использованием типа struct не с экземпляром


Я реализовал отображение строки в структуру следующим образом.
Здесь я сопоставил требуемый ключ(строку) с экземпляром структуры(объектом).
Но я хочу сопоставить ключ(строку) с именем типа структуры, а затем получить значение из экземпляра этой структуры.

Main.cpp

#include <iostream>
    #include <string>
    using namespace std;
    #include "myfile.h"
    
	int main()
	{
		string item="IndicatorLED";
		func (item);
		
		string item1="AssetTag";
		func(item1);
		
		string item2="ManagerType";
		func(item2);
		
		string item3="Count";
		func(item3);
	}


файл myfile.ч

#ifndef MYFILE_H
    #define MYFILE_H
    #include <iostream>
    #include <algorithm>
    #include<vector>
    #include <string>
    #include <map>
    
    using namespace std;
    
    struct Chassis
    {
        string InLED;
        string AstTg;
    };
    
    struct Manager
    {
        string MngrType;
        int count;
    };
    
    const Chassis chassis1 = {"On", "null"}; 
	const Manager manager1 = {"BMC", 23};    
	
	const map<string, const string> cha1 =
	{
		{ "IndicatorLED",	chassis1.InLED		},
		{ "AssetTag"	,	chassis1.AstTg		},
		{ "ManagerType"	,	manager1.MngrType	}
	};
	
	const map<string, int> cha2 =
	{
		{ "Count", manager1.count }
	};
    
    void func(string);
    #endif

myfile.cpp

#include <iostream>
    #include <string>
    #include "myfile.h"
    #include <map>
    
    using namespace std;
    
    void func(string item)
	{
		if (cha1.find(item) == cha1.end())
		{
			if (cha2.find(item) != cha2.end())
			{
				cout << item << ":" << cha2.at(item) << endl;
			}
		}
		else
		{
			cout << item << ":" << cha1.at(item) << endl;
		}
	}


Теперь здесь я сопоставил `string` с `chassis1.InLED`.
Мой вопрос заключается в том, есть ли какая-либо возможность сопоставить строку с "шасси" (типом структуры) и теперь получить ключ значения из экземпляра этой структуры.

Что я уже пробовал:

У меня нет никакой идеи реализовать сопоставление между строкой и типом структуры (именем) и получить соответствующее значение экземпляра из этого экземпляра структуры.

2 Ответов

Рейтинг:
1

KarstenK

То шаблон карты классов имеет несколько интересных функций, которые помогут вам. Взгляните на пример кода по этой ссылке, чтобы функция поиска для лучшего понимания реального использования. Вы также запросили поиск ключа, который выполняется с некоторыми итератор.

Почему вы не воспользовались какой-нибудь поисковой системой, чтобы найти эту информацию?


Рейтинг:
0

CPallini

Конечно, это возможно. Однако вы должны использовать a std::map<string, Chassis>, другими словами, одна и та же карта не может содержать в одно и то же время объекты несвязанных типов, таких как Chassis и Manager.

[обновление]
Пример кода:

#include <iostream>
#include <string>
#include <map>

using namespace std;

struct Chassis
{
  string inLED;
  string astTg;
};


int main()
{
  map <string, Chassis> mc;

  mc["Chassis1"] = { "On", "null"};
  mc["Chassis2"] = { "Off", "null"};
  mc["Chassis3"] = { "On", "null"};

  cout << "list of chassis: " << endl;
  for (const auto & c : mc) // iterate on map items 
    cout << c.first << " {" << c.second.inLED << ", " << c.second.astTg << "}" << endl;

  string s = "Chassis1";
  cout << endl << "searching for item '" << s << "'" << endl;
  auto it = mc.find(s); // search for the 'Chassis1' item
  if ( it != mc.end())
    cout << "found " << it->first << " {"<< it->second.inLED << ", " << it->second.astTg << "}" << endl;
}

[/обновление]


gvsk

После реализации std::map<string, Chassis>, Я могу получить значения экземпляров для структуры типа "Chassis". Как я могу получить chassis1.InLED из этого отображения?

CPallini

Смотрите мое обновленное решение.