#include <iostream>
#include <string>
#define TYPE_INIT_(_Number, _Line, _Type,...) struct ln_##_Line##_number_##_Number : public _Type\
{\
ln_##_Line##_number_##_Number()\
:_Type(__VA_ARGS__){}\
\
ln_##_Line##_number_##_Number(const _Type& _val)\
:_Type(_val){}\
\
const _Type& operator=(const _Type& _val)\
{\
((_Type)(*this)) = _val;\
return (*this);\
}\
}
#define TYPE_INIT(_Number, _Line, _Type,...) TYPE_INIT_(_Number, _Line, _Type, __VA_ARGS__)
#define INIT(_Type, ...) TYPE_INIT(__COUNTER__, __LINE__, _Type, __VA_ARGS__)
// использование
struct ABC
{
int A,B,C;
ABC(int _A,int _B,int _C)
:A(_A),
B(_B),
C(_C)
{}
};
struct TestClass
{
INIT( std::string, "Ololo" ) lv_String;
INIT( ABC, 1, 2, 3 ) lv_ABC;
};
std::ostream & operator << (std::ostream &out, const TestClass &t) {
std::cout << t.lv_String << " " << t.lv_ABC.A << " " <<
t.lv_ABC.B << " " << t.lv_ABC.C;
return out;
}
int main() {
TestClass t;
std::cout << t << std::endl;
t.lv_String = "Hui";
t.lv_ABC = ABC(4,5,6);
std::cout << t << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKI2RlZmluZSBUWVBFX0lOSVRfKF9OdW1iZXIsIF9MaW5lLCBfVHlwZSwuLi4pIHN0cnVjdCBsbl8jI19MaW5lIyNfbnVtYmVyXyMjX051bWJlciA6IHB1YmxpYyBfVHlwZVwKe1wKICBsbl8jI19MaW5lIyNfbnVtYmVyXyMjX051bWJlcigpXAogICAgOl9UeXBlKF9fVkFfQVJHU19fKXt9XApcCiAgbG5fIyNfTGluZSMjX251bWJlcl8jI19OdW1iZXIoY29uc3QgX1R5cGUmIF92YWwpXAogICAgOl9UeXBlKF92YWwpe31cClwKICBjb25zdCBfVHlwZSYgb3BlcmF0b3I9KGNvbnN0IF9UeXBlJiBfdmFsKVwKICB7XAogICAgKChfVHlwZSkoKnRoaXMpKSA9IF92YWw7XAogICAgcmV0dXJuICgqdGhpcyk7XAogIH1cCn0KI2RlZmluZSBUWVBFX0lOSVQoX051bWJlciwgX0xpbmUsIF9UeXBlLC4uLikgIFRZUEVfSU5JVF8oX051bWJlciwgX0xpbmUsIF9UeXBlLCBfX1ZBX0FSR1NfXykKI2RlZmluZSBJTklUKF9UeXBlLCAuLi4pIFRZUEVfSU5JVChfX0NPVU5URVJfXywgX19MSU5FX18sIF9UeXBlLCBfX1ZBX0FSR1NfXykKCi8vINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC1CgpzdHJ1Y3QgQUJDCnsKICBpbnQgQSxCLEM7CiAgCiAgQUJDKGludCBfQSxpbnQgX0IsaW50IF9DKQogICAgOkEoX0EpLAogICAgQihfQiksCiAgICBDKF9DKQogIHt9Cn07CgoKc3RydWN0IFRlc3RDbGFzcwp7CiAgSU5JVCggc3RkOjpzdHJpbmcsICJPbG9sbyIgKSBsdl9TdHJpbmc7CiAgSU5JVCggQUJDLCAxLCAyLCAzICkgbHZfQUJDOwp9OwoKc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSAmb3V0LCBjb25zdCBUZXN0Q2xhc3MgJnQpIHsKICAgIHN0ZDo6Y291dCA8PCB0Lmx2X1N0cmluZyA8PCAiICIgPDwgdC5sdl9BQkMuQSA8PCAiICIgPDwKICAgICAgICB0Lmx2X0FCQy5CIDw8ICIgIiA8PCB0Lmx2X0FCQy5DOwogICAgcmV0dXJuIG91dDsKfQoKaW50IG1haW4oKSB7CgogICAgVGVzdENsYXNzIHQ7CiAgICBzdGQ6OmNvdXQgPDwgdCA8PCBzdGQ6OmVuZGw7CiAgICB0Lmx2X1N0cmluZyA9ICJIdWkiOwogICAgdC5sdl9BQkMgPSBBQkMoNCw1LDYpOwogICAgc3RkOjpjb3V0IDw8IHQgPDwgc3RkOjplbmRsOwp9Cg==