#include <iostream>
#include <utility>
using namespace std;
// ==========================
template <typename F>
void apply(F&&) {}
template <typename F, typename First, typename... Rest>
void apply(F&& f, First&& first, Rest&&... rest) {
std::forward<F>(f)(std::forward<First>(first));
apply(std::forward<F>(f), std::forward<Rest>(rest)...);
}
// ==========================
class A{
public:
int x, y, z;
A() {
this->x = 0;
this->y = 0;
this->z = 0;
}
~A() { }
void init (int x_in, int y_in, int z_in){
this->x = x_in;
this->y = y_in;
this->z = z_in;
}
int sum(){
return this->x + this->y + this->z;
}
void show_result() {
int result = sum();
cout << "sum = " << result << endl;
}
};
#define PP_MEMBER_LIST A_CAR, A_CAT, A_CANADA
class B {
public:
A PP_MEMBER_LIST;
B() {
A_CAR.init(0, 1, 2);
A_CAT.init(1, 2, 3);
A_CANADA.init(8, 7, 6);
}
~B() {}
void show_all_result() {
const auto show_result = [](A& a) { a.show_result(); };
apply(show_result, PP_MEMBER_LIST);
}
};
int main() {
B obj_B;
obj_B.show_all_result();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09CnRlbXBsYXRlIDx0eXBlbmFtZSBGPgp2b2lkIGFwcGx5KEYmJikge30KCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUuLi4gUmVzdD4Kdm9pZCBhcHBseShGJiYgZiwgRmlyc3QmJiBmaXJzdCwgUmVzdCYmLi4uIHJlc3QpIHsKICBzdGQ6OmZvcndhcmQ8Rj4oZikoc3RkOjpmb3J3YXJkPEZpcnN0PihmaXJzdCkpOwoKICBhcHBseShzdGQ6OmZvcndhcmQ8Rj4oZiksIHN0ZDo6Zm9yd2FyZDxSZXN0PihyZXN0KS4uLik7Cn0KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0KCgoKY2xhc3MgQXsKcHVibGljOgogICAgaW50IHgsIHksIHo7CgogICAgQSgpIHsKICAgICAgICB0aGlzLT54ID0gMDsKICAgICAgICB0aGlzLT55ID0gMDsKICAgICAgICB0aGlzLT56ID0gMDsKICAgIH0KICAgIAogICAgfkEoKSB7IH0KCiAgICB2b2lkIGluaXQgKGludCB4X2luLCBpbnQgeV9pbiwgaW50IHpfaW4pewogICAgICAgIHRoaXMtPnggPSB4X2luOwogICAgICAgIHRoaXMtPnkgPSB5X2luOwogICAgICAgIHRoaXMtPnogPSB6X2luOwogICAgfQoKICAgIGludCBzdW0oKXsKICAgICAgICByZXR1cm4gdGhpcy0+eCArIHRoaXMtPnkgKyB0aGlzLT56OwogICAgfQoKICAgIHZvaWQgc2hvd19yZXN1bHQoKSB7CiAgICAgICAgaW50IHJlc3VsdCA9IHN1bSgpOwogICAgICAgIGNvdXQgPDwgInN1bSA9ICIgPDwgcmVzdWx0IDw8IGVuZGw7CiAgICB9Cn07CgoKCiNkZWZpbmUgUFBfTUVNQkVSX0xJU1QgQV9DQVIsIEFfQ0FULCBBX0NBTkFEQQoKY2xhc3MgQiB7CnB1YmxpYzoKICAgIEEgUFBfTUVNQkVSX0xJU1Q7CgogICAgQigpIHsKICAgICAgICBBX0NBUi5pbml0KDAsIDEsIDIpOwogICAgICAgIEFfQ0FULmluaXQoMSwgMiwgMyk7CiAgICAgICAgQV9DQU5BREEuaW5pdCg4LCA3LCA2KTsKICAgIH0KICAgIAogICAgfkIoKSB7fQogICAgCiAgICB2b2lkIHNob3dfYWxsX3Jlc3VsdCgpIHsKICAgIAljb25zdCBhdXRvIHNob3dfcmVzdWx0ID0gW10oQSYgYSkgeyBhLnNob3dfcmVzdWx0KCk7IH07CiAgICAJCiAgICAJYXBwbHkoc2hvd19yZXN1bHQsIFBQX01FTUJFUl9MSVNUKTsKICAgIH0KfTsKCgppbnQgbWFpbigpIHsgCgogICAgQiBvYmpfQjsKCiAgICBvYmpfQi5zaG93X2FsbF9yZXN1bHQoKTsKfQo=