___arrow
#define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__)
#define ___type(...) __typeof_unqual__(___arrow(__VA_ARGS__))
#define ___type(...) __typeof_unqual__(___arrow(__VA_ARGS__))
#define ___type(...) typeof(___arrow(__VA_ARGS__))