@broken

Можно ли создавать в рантайме объект в C++?

Помогите, народ.
Я вроде как знаю, что такое интроспекция, на примере C# и Python. В последнем у меня в проекте динамически создается сложный объект в рантайме. Можно ли создавать в рантайме объект в C++ (и заранее из кода к нему обращаться)?
Например, типа такого:

auto object = ObjectFactory::genererateObject(objectToParse);
object.field1.field2 = NULL;

В духе такого?
  • Вопрос задан
  • 2932 просмотра
Решения вопроса 2
@nicolausYes
Немного неясен вопрос. Но так как вы написали, да, можно. В процессе компиляции компилятор определит нужный тип, который возвращает ваш класс и подставит его вместо "auto". Если вы обращаетесь к неверным полям, несвойственным этому типу, компилятор вам это скажет во время компиляции.

Но все же приведенный вами пример - не интроспекция. Интроспекция в С++ достигается посредством RTTI. У вас в примере тип объекта известен во время компиляции.
Ответ написан
AxisPod
@AxisPod
То что вы написали в C++ в принципе реализовать нельзя. Нельзя в таком виде.
Есть например boost::any, можно вернуть любой тип, но работать с ним уже не так просто.

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

Вам стоит смотреть в сторону типов variant, которые частично реализуют возможности типов из языков без строгой типизации.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
можно попробовать как-нибудь так:

typedef boost::variant<int, string, bool> field_t;
typedef std::map<string, field> settings_t;
struct A
{
   A(file)
   : settings_(file.parse())
   {}
private:
   settings_t settings_;
   int my_method()
   {
      int a = boost::get<int>(settings_["a"]);
      int b = boost::get<int>(settings_["b"]);
      return a + b;
   }
}
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Разрешите вставить и свои 5e−2 Р

Известно ли что-то о том, какой тип будет иметь наш auto? Если известно, то может, сработает просто

dynamic_cast<Type>(object).field1.field2 = NULL;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы