Как я могу проверить типы производных классов в C ++? - PullRequest
1 голос
/ 05 февраля 2020

Допустим, у меня есть некоторый базовый абстрактный класс и три разных класса, которые производят и реализуют его методы. Есть ли объект типа, как в C#? Или, другими словами, как мне получить экземпляры всех этих классов?

#ModuleBase.cpp
class ModuleBase {

};

#Module1.cpp
class Module1 : public virtual ModuleBase {

};

#Module2.cpp
class Module2 : public virtual ModuleBase {

};

#Module3.cpp
class Module3 : public virtual ModuleBase {

};

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вы можете создать instanceof подобные методы, которые могут определять тип объекта с использованием шаблонов и std::is_base_of ( 1 ) или dynamic_cast только для полиморфных c объектов ( 2 ).

1 Живой образец

template<typename Base, typename T> inline bool instanceof(const T) {
   return is_base_of<Base, T>::value;
}
int main() {
   Module1 module;
   if(instanceof<Module1>(module)) {
      cout << "Module1" << endl;
   }
   if(instanceof<Module2>(module)) {
      cout << "Module2" << endl;
   }
   if(instanceof<ModuleBase>(module)) {
      cout << "ModuleBase" << endl;
   }
}

2 Живой образец

class ModuleBase { public: virtual ~ModuleBase(){} };

template<typename T> inline bool instanceof(const ModuleBase * base) {
   return dynamic_cast<const T*>(base);
}
int main() {

   Module1* module = new Module1();

   if(instanceof<Module1>(module)) {
      cout << "Module1" << endl;
   }
   if(instanceof<Module2>(module)) {
      cout << "Module2" << endl;
   }
   if(instanceof<ModuleBase>(module)) {
      cout << "ModuleBase" << endl;
   }
}

Объект имеет тип ModuleBase и Module1. Я думаю, что с этим вы можете достичь того, что вам нужно.

1 голос
/ 05 февраля 2020

В дополнение к другим ответам вы можете сгенерировать некоторого кода C ++, делающего то, что вы хотите. Рассмотрим, например, использование GPP из вашего инструмента автоматизации сборки (например, Makefile) или напишите простой AWK , Guile или Python скрипт, который делает то, что вы хотите (или какой-то ad-ho c генератор C ++ выше ANTLR , вдохновленный SWIG ), и генерирует некоторый код C ++ для каждого твои нужды. Мой устаревший G CC MELT сделал это (динамически, во время выполнения) на Linux.

Qt имеет мета-объект Протокол делает именно это. Вы можете получить вдохновение от его moc (который является открытым исходным кодом), генерирующего код C ++.

Посмотрите также на продолжающийся (но - в феврале 2020 года - embryoni c) RefPerSys проект. Мы хотим использовать эти идеи, и мы начинаем их реализовывать. Обратите внимание, что Linux dlopen может быть вызван тысячи раз на практике для общих объектов, созданных путем компиляции сгенерированного и временного кода C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...