#include <iostream>
template <int>
struct Inc
{
enum { value = 0 };
};
template <int index>
struct Id
{
enum { value = Id<index - 1>::value + Inc<index - 1>::value };
};
template <>
struct Id<0>
{
enum { value = 0 };
};
#define CLASS_DECLARATION(Class) \
template <> \
struct Inc<__LINE__> \
{ \
enum { value = 1 }; \
}; \
\
struct Class \
{ \
enum { id = Id<__LINE__>::value }; \
private:
CLASS_DECLARATION(A)
// ...
};
CLASS_DECLARATION(B)
// ...
};
CLASS_DECLARATION(C)
// ...
};
int main()
{
std::cout << A::id << std::endl;
std::cout << B::id << std::endl;
std::cout << C::id << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGludD4Kc3RydWN0IEluYwp7CiAgICBlbnVtIHsgdmFsdWUgPSAwIH07Cn07CiAgICAKdGVtcGxhdGUgPGludCBpbmRleD4Kc3RydWN0IElkCnsKCWVudW0geyB2YWx1ZSA9IElkPGluZGV4IC0gMT46OnZhbHVlICsgSW5jPGluZGV4IC0gMT46OnZhbHVlIH07Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgSWQ8MD4KewoJZW51bSB7IHZhbHVlID0gMCB9Owp9OwoKI2RlZmluZSBDTEFTU19ERUNMQVJBVElPTihDbGFzcykgXAp0ZW1wbGF0ZSA8PiBcCnN0cnVjdCBJbmM8X19MSU5FX18+IFwKeyBcCgllbnVtIHsgdmFsdWUgPSAxIH07IFwKfTsgXAogXApzdHJ1Y3QgQ2xhc3MgXAp7IFwKCWVudW0geyBpZCA9IElkPF9fTElORV9fPjo6dmFsdWUgfTsgXApwcml2YXRlOgoKQ0xBU1NfREVDTEFSQVRJT04oQSkKICAgIC8vIC4uLgp9OwoKQ0xBU1NfREVDTEFSQVRJT04oQikKICAgIC8vIC4uLgp9OwoKQ0xBU1NfREVDTEFSQVRJT04oQykKICAgIC8vIC4uLgp9OwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgQTo6aWQgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IEI6OmlkIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBDOjppZCA8PCBzdGQ6OmVuZGw7Cn0=