Есть у меня несколько классов с одинаково называющимися методами, которые не удалось сделать виртуальными.
Надо обойти экземпляры всех классов и вызвать эти методы.
Макросом это решить получилось, но криво - с помощью двух макросов, один для конструкторов без параметров, другой для конструкторов с параметрами.
Темплейтом тоже лучше не получается.
Решаема ли эта проблема в принципе, или я зря мучаюсь?
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);
}