#include <iostream>
#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 DEF_VAR(TYPE, NAME) argument_type<void(TYPE)>::type NAME
int main()
{
#define MEM ((O::A<int*, int>))(val)
#define SEQ (MEM)
DEF_VAR
(
BOOST_PP_SEQ_ELEM(0, BOOST_PP_SEQ_HEAD(SEQ)),
BOOST_PP_SEQ_ELEM(1, BOOST_PP_SEQ_HEAD(SEQ))
);
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci5ocHA+CgpzdHJ1Y3QgTwp7Cgl0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgoJc3RydWN0IEEge307Cn07CnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBhcmd1bWVudF90eXBlOwp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgpzdHJ1Y3QgYXJndW1lbnRfdHlwZTxUKFUpPgp7Cgl1c2luZyB0eXBlID0gVTsKfTsKI2RlZmluZSBERUZfVkFSKFRZUEUsIE5BTUUpIGFyZ3VtZW50X3R5cGU8dm9pZChUWVBFKT46OnR5cGUgTkFNRQppbnQgbWFpbigpCnsKCSNkZWZpbmUgTUVNICgoTzo6QTxpbnQqLCBpbnQ+KSkodmFsKQoJI2RlZmluZSBTRVEgKE1FTSkKCURFRl9WQVIKCSgKCQlCT09TVF9QUF9TRVFfRUxFTSgwLCBCT09TVF9QUF9TRVFfSEVBRChTRVEpKSwKCQlCT09TVF9QUF9TRVFfRUxFTSgxLCBCT09TVF9QUF9TRVFfSEVBRChTRVEpKQoJKTsKfQ==