gvsk Ответов: 2

Сопоставить элемент структуры с ключом


Я хочу получить значение определенного ключа из бэк-энда.
В фоновом режиме определяются структуры и инициализируются значения. Рассмотрим это как структуру, определенную в back-end:

struct person{
    string nme;
    string adrs;
    int id;
};

person p1 = {"steve","ABC street",23};

Адрес ключа соответствует значению p1.adrs в бэк-энде.
Теперь ключевой адрес должен быть сопоставлен с (p1 & adrs) во внешнем файле и должен получить значение "ABC street".
Мой вопрос заключается в том, как должно быть выполнено сопоставление ключа и его конкретного структурного элемента во внешнем файле и как получить значение для этого ключа.

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

Я реализовал это отображение с помощью JSON.

{
 "address":"p1.adrs",
 "name":"p1.nme",
  ........
}

Теперь p1.adrs будет строкой, и поскольку CPP не поддерживает отражение времени выполнения, я не могу этого сделать.

Richard MacCutchan

Я не уверен, что понимаю, какое отношение к этому имеет текст JSON. Очевидный ответ заключается в том, что бэкэнд хранит эти данные в какой-то форме файла базы данных. Затем любой набор можно получить, передав соответствующий ключ.

2 Ответов

Рейтинг:
13

CPallini

Ваш struct может непосредственно обеспечить отображение, используя, например, std::map с std::string как ключ и А union (или std::variant, если вы можете использовать его) как ценность.


Простой пример (вам нужен C++17 компилятор).
[обновление]

#include <iostream>
#include <unordered_map>
#include <variant>
using namespace std;


class person
{
  unordered_map<string, variant<string, int> > msv; // this is the storage for the variables
public:
  person(string nme, string adrs, int id)
  {
    msv["nme"] = nme;
    msv["adrs"] = adrs;
    msv["id"] = id;
  }
  variant <string, int> operator[](const string & key)
  {
    auto it = msv.find(key);
    if ( it != msv.end())
      return it->second;
    throw( out_of_range("key not found")); // an alternative could be returning an empty variant
  }
};


int main()
{
  person p("steve","ABC street",23);

  cout << get<string>(p["nme"]) << ", " << get<int>(p["id"]) << endl; // OK, accessing existing fields

  cout << "'" << get<string>(p["foo"]) << "'" << endl; // Error, accessing missing field
}

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


gvsk

Не могли бы вы привести пример кода для небольшого варианта использования?
Я уже сделал это:

#include <iostream>
#include <string>
#включать

использование пространства имен std;

конструкция шасси
{
строка InLED;
};

тап_п()
{
Шасси chassis1={"ВКЛ."};

строка item="IndicatorLED";

карта<строка, шасси> cha1;
cha1["IndicatorLED"] = chassis1;

если(cha1 не.найти(элемент) == cha1 не.конец()) {соиь <&ЛТ;"не существует";}

else {cout <<cha1[item].InLED ;}

возвращает 0;
}

Здесь я могу сопоставить эту строковую переменную("IndicatorLED") со структурой, но не могу сопоставить ее с этим членом (InLED).
Требование состоит в том, чтобы сопоставить строковую переменную с конкретным членом структуры.

CPallini

На самом деле вы могли бы (просто сопоставить указатель на него), однако это было бы неудобно.
Я имел в виду перепроектировать вашу структуру данных, чтобы обеспечить доступ к карте членов.

gvsk

Извините, я не понимаю. Не могли бы вы предоставить пример кода

CPallini

Самый простой подход-это использование непосредственно map<string,string>, а не struct person.
Таким образом, каждая "переменная" становится строкой. Если это неприемлемо, то вы должны использовать map<string, Variable> где Переменная это объединение или, используя C++17, вариант.

gvsk

Я очень ценю ваши ответы. Но я новичок в CPP. Я хочу реализовать это сопоставление вариантов строк. Не могли бы Вы привести мне пример?
Большое спасибо..

CPallini

Я обновил свой ответ.

CPallini

Добро пожаловать.

gvsk

Привет
В ответе, который я обновил, я сопоставил строку с экземпляром структуры типа "IndicatorLED" с "chassis1.InLED". Вместо этого есть ли какая - либо возможность отображать с помощью самого типа структуры, используя "шасси". ("Шасси" вместо "chassis1").

Рейтинг:
10

gvsk

myfile.cpp

#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()){} else {cout<< item<<":"<<cha2.at(item)<<endl;} }
    
    else {cout<< item<<":"<<cha1.at(item)<<endl;}

    
}


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);
}


Это требование. Но будет лучше, если я объявлю сопоставления в отдельном файле (здесь объявлено в файле .h).