Эквивалент java.lang.Field в C++

У меня есть код, который использует встроенную функцию поля в java, и я не смог найти способ заменить его в С ++, код показан ниже,

import java.lang.reflect.Field; 
 
public class ParameterValue { 
    public String objectPath; 
    public Object objectReference; 
    public String fieldPath; 
    public String fieldPathNoCase; 
    public Field field; 
 public double value; 
  
 public ParameterValue(String path, ObjectTree tree, Field fieldInfo) { 
  objectPath = path; 
  objectReference = tree.getObject(path); 
  field = fieldInfo; 
  fieldPath = objectPath + "." + field.getName(); 
  fieldPathNoCase = fieldPath.toLowerCase();  
  read(); 
 } 
 
 public int getPrecision() { 
if (field.getType().getName() == "float" || field.getType().getName() == "double") 
   return 2; 
  else 
   return 0; 
 } 
  
 public double getPrecisionMultiplier() { 
  return Math.pow(10, getPrecision()); 
 } 
  
 public void read() { 
  String type = field.getType().getName(); 
  try { 
   if (type.equals("double")) 
    value = field.getDouble(objectReference); 
   else if (type.equals("float")) 
    value = field.getFloat(objectReference); 
   else if (type.equals("int")) 
    value = field.getInt(objectReference); 
   else if (type.equals("byte")) 
    value = field.getByte(objectReference); 
   else 
    throw new RuntimeException(); 
  } catch (IllegalAccessException e) { 
   throw new RuntimeException(e); 
  } 
  value = Math.round(value * getPrecisionMultiplier()) / getPrecisionMultiplier(); 
 } 
  
 public void write() { 
  String type = field.getType().getName(); 
  try { 
   if (type.equals("double")) 
    field.setDouble(objectReference, value); 
   else if (type.equals("float")) 
    field.setFloat(objectReference, (float)value); 
   else if (type.equals("int")) 
    field.setInt(objectReference, (int)Math.round(value)); 
   else if (type.equals("byte")) 
    field.setByte(objectReference, (byte)Math.round(value)); 
   else 
	   throw new RuntimeException(); 
  } catch (IllegalAccessException e) { 
   throw new RuntimeException(e); 
  } 
 } 
  
 public void rebind(ObjectTree tree) { 
  objectReference = tree.getObject(objectPath); 
 } 
}

Из кода я понял, что мне нужно найти класс, который может преобразовать значение в нем в Double, Float и т. д. Я искал что-то, что может сделать это, но не смог. ссылка на код: https://www.programcreek.com/java-api-examples/index.php?source_dir=SecugenPlugin-master/src/sourceafis/simple/Fingerprint.java#

Нет эквивалента. В C++ нет отражений. Возможно, вы сможете сделать что-то подобное с каким-нибудь вариантом.

Jaa-c 17.04.2018 13:57

Имхо, вам лучше описать, что вы хотите, чтобы код С ++ делал

463035818_is_not_a_number 17.04.2018 13:58

Как я могу применить это подобным образом?

A M A 17.04.2018 13:59

@ Jaa-c, не совсем так, там решения, только не из коробки.

M. Prokhorov 17.04.2018 13:59

Простая обертка вокруг союза?

crea7or 17.04.2018 14:01

Нет эквивалента, как и не может быть эквивалента. Это два совершенно разных языка программирования.

Ron 17.04.2018 14:03

@ M.Prokhorov ваши связанные решения являются ли они классами, которые я могу использовать, чтобы получить тот же результат в поле?

A M A 17.04.2018 14:06

@AMA, я не понимаю этого вопроса. Что значит «они сделали классы»? Вы читали какие-либо подробности о решениях, которые я связал?

M. Prokhorov 17.04.2018 14:34

@ М.Прохоров, насколько я понял, они пытаются реализовать свой собственный класс поля

A M A 17.04.2018 15:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько мне известно, в C++ нет эквивалентного класса. Теперь для вашего требования сначала вы перечислите, что все классы java.lang.reflect.Field предоставляют в java. После того, как вы перечислили все служебные методы, просто отсортируйте список всех методов, которые вам действительно нужны в вашем приложении C++. После этого вы создаете класс C++ с тем же именем и типами методов и, если возможно, реализуете логику самостоятельно.

Вы не можете просто реализовать отражения самостоятельно. Это языковая функция, а не то, что вы реализуете. Для достижения аналогичной цели в C++ вам нужна совершенно другая логика.

Jaa-c 17.04.2018 14:41

Мне удалось создать класс Field, который обслуживает мой SDK, и он отлично работает. Спасибо за идею.

A M A 17.04.2018 15:22

Другие вопросы по теме