Я работаю над кодом, который я хочу использовать для извлечения данных из объектов с большим количеством полей данных. Мой код выглядит следующим образом:Есть ли способ автоматически указывать указатели void?
void* get(std :: string field_name)
{
(...)
if(field_name == "wbc") { return &(this -> wbc); };
if(field_name == "delay") { return &(this -> delay); };
if(field_name == "ntracks") { return &(this -> ntracks); };
if(field_name == "ntrackFPix") { return &(this -> ntrackFPix); };
if(field_name == "ntrackBPix") { return &(this -> ntrackBPix); };
if(field_name == "ntrackFPixvalid") { return &(this -> ntrackFPixvalid); };
if(field_name == "ntrackBPixvalid") { return &(this -> ntrackBPixvalid); };
(...)
std :: cerr << "Error: EventData.get() is unable to find the field: "
<< field_name << ". " << std :: endl;
exit(-1);
return NULL;
}
И это, как я вызвать функцию Get() (C++ 11):
void* ptr = this -> event_field -> get("ntracks");
auto n_tracks = (auto)(*ptr);
Это, однако, дает мне сообщение об ошибке ... Is есть способ добиться того, чего я хочу?
У меня действительно большие структуры с полями в следующих типах: int, double, int * (array), double * (array), char * (string).
Есть ли другой способ, чем вручную найти все поля данных для каждой функции, отфильтровывать их вручную по типам и получать функции с различными типами возврата?
Update:
Чтобы указать, что я хочу добиться:
Я знаю, что тип, но она меняется от случая к случаю. Есть ли решение, которое я могу использовать для передачи типа из класса в функцию?
Например:
Class A
{
std :: vector<std :: string> typenames;
std :: vector<std :: string> identifiers;
};
Class B
{
(...)
{
(I want to get the given field of given type (specified in A) from a massive object with lots of fields(and I don't know before runtime which fields I will need)
}
(...)
};
У вас есть указатель на пустоту, так как компилятор знает что-либо о базовом типе, на который указывает? – Sean
Вы всегда можете 'reinterpret_cast (...)' все в вашей функции. Я не уверен, что поможет строка 'auto n_tracks = (auto) (* ptr);', хотя; Я думаю, вам, возможно, придется сделать еще один «reinterpret_cast» обратно к соответствующему типу. –
Имя поля говорит вам, что делать с полем, поэтому оно имеет больше информации, чем тип поля. Вместо функции 'get' я предлагаю функцию' do', которая будет принимать имя поля, и от этого берет значение, а также делать то, что он должен делать. – Dialecticus