@Zellily

Как создать экземпляр класса внутри макроса или шаблона, передавая имя класса, если класс может иметь/не иметь параметры конструктора?

Есть у меня несколько классов с одинаково называющимися методами, которые не удалось сделать виртуальными.
Надо обойти экземпляры всех классов и вызвать эти методы.

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

Решаема ли эта проблема в принципе, или я зря мучаюсь?

UPD Ну, скажем, есть такой условный код:

// Example program
#include <iostream>
#include <string>

enum ClassNum {
   cl1 = 0,
   cl2 = 1,
};

class Parent{
   public:
      Parent(long addr): Addr(addr){}
      bool PutData(int data) { *(int*)Addr = data; return (data == *(int*)Addr); } 
      //void NotVirtualF(...);
   protected:
      int c0 = 0;
      int c1 = 50;
      int c2 = 100;
      int c3 = 150;
      int c4 = 200;
   private:
      long Addr;
};


class Child0 : Parent{
   public:
      Child0() : Parent( (long)&(Parent::c0) ){};
      void NotVirtualF() { PutData(42); PutData(24); PutData(37); }
};

class ChildNum : Parent{
   public:
      ChildNum(ClassNum num) : Parent( num == ClassNum::cl1 ? (long)&(Parent::c1) : (long)&(Parent::c2) ){};
      void NotVirtualF() { PutData(88); PutData(77); }
};

class Child3 : Parent{
   public:
      Child3() : Parent( (long)&(Parent::c3) ){};
      void NotVirtualF() { PutData(67); }
      void NotVirtualF(bool zzz) { if(zzz) PutData(22); else PutData(71); }
};

class Child4 : Parent{
   public:
      Child4() : Parent( (long)&(Parent::c4) ){};
      // No function at all
};

#define CHILD_MACRO(childName) { \
   childName child##childName; \
   child##childName.NotVirtualF(); \
   std::cout << #childName "\n"; \
} 

#define CHILD_MACRO_PARAM(childName, param) { \
   childName child##childName##param(param); \
   child##childName##param.NotVirtualF(); \
   std::cout << #childName << param << "\n"; \
} 

int main()
{
  std::cout << "Hello\n";
  int container = 5;
  Parent P((long int)&container);
  std::cout << (P.PutData(42) ? "OK" : "FAIL") << "\n";
  
  CHILD_MACRO(Child0);
  CHILD_MACRO_PARAM(ChildNum, cl1);
  CHILD_MACRO_PARAM(ChildNum, cl2);  
  CHILD_MACRO(Child3); 
}
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
maaGames
@maaGames
Погроммирую программы
Если не удалось сделать виртуальными - то это принципиально разные объекты и обходить их за один раз в любом случае не следует. А раз всё-равно обходить "двумя циклами", то ничего страшного, что для этого разный шаблонный метод используется.
Ответ написан
Ваш ответ на вопрос

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

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