#include <boost/preprocessor.hpp>
struct O
{
template <class T1, class T2>
struct A {};
};
template<class T>
struct argument_type;
template<class T, class U>
struct argument_type<T(U)>
{
using type = U;
};
#define TDEF(TYPE, NAME) using NAME = argument_type<void(TYPE)>::type
#define INHERIT(R, DATA, ELEM) , argument_type<void(BOOST_PP_SEQ_ELEM(0, ELEM))>::type
#define MEMBER(R, DATA, ELEM) TDEF(BOOST_PP_SEQ_ELEM(0, ELEM), BOOST_PP_SEQ_ELEM(1, ELEM));
#define CREATE_CLASS(NAME, MEMBERS) \
struct NAME \
: argument_type<void(BOOST_PP_SEQ_ELEM(0, BOOST_PP_SEQ_HEAD(MEMBERS)))>::type \
BOOST_PP_SEQ_FOR_EACH(INHERIT, _, BOOST_PP_SEQ_TAIL(MEMBERS)) \
{ \
BOOST_PP_SEQ_FOR_EACH(MEMBER, _, MEMBERS) \
}
CREATE_CLASS(test_class, (((O::A<int*, int>))(val)));
int main()
{
}
I2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci5ocHA+CgpzdHJ1Y3QgTwp7Cgl0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgoJc3RydWN0IEEge307Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgYXJndW1lbnRfdHlwZTsKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4Kc3RydWN0IGFyZ3VtZW50X3R5cGU8VChVKT4KewoJdXNpbmcgdHlwZSA9IFU7Cn07CgojZGVmaW5lIFRERUYoVFlQRSwgTkFNRSkgdXNpbmcgTkFNRSA9IGFyZ3VtZW50X3R5cGU8dm9pZChUWVBFKT46OnR5cGUKI2RlZmluZSBJTkhFUklUKFIsIERBVEEsIEVMRU0pICwgYXJndW1lbnRfdHlwZTx2b2lkKEJPT1NUX1BQX1NFUV9FTEVNKDAsIEVMRU0pKT46OnR5cGUKI2RlZmluZSBNRU1CRVIoUiwgREFUQSwgRUxFTSkgVERFRihCT09TVF9QUF9TRVFfRUxFTSgwLCBFTEVNKSwgQk9PU1RfUFBfU0VRX0VMRU0oMSwgRUxFTSkpOwojZGVmaW5lIENSRUFURV9DTEFTUyhOQU1FLCBNRU1CRVJTKSBcCglzdHJ1Y3QgTkFNRSBcCgkJOiBhcmd1bWVudF90eXBlPHZvaWQoQk9PU1RfUFBfU0VRX0VMRU0oMCwgQk9PU1RfUFBfU0VRX0hFQUQoTUVNQkVSUykpKT46OnR5cGUgXAoJCUJPT1NUX1BQX1NFUV9GT1JfRUFDSChJTkhFUklULCBfLCAgQk9PU1RfUFBfU0VRX1RBSUwoTUVNQkVSUykpIFwKCXsgXAoJIAlCT09TVF9QUF9TRVFfRk9SX0VBQ0goTUVNQkVSLCBfLCBNRU1CRVJTKSBcCgl9CgpDUkVBVEVfQ0xBU1ModGVzdF9jbGFzcywgKCgoTzo6QTxpbnQqLCBpbnQ+KSkodmFsKSkpOwoKaW50IG1haW4oKQp7Cn0=