#include <tuple>
#include <type_traits>
template <typename T, template <typename> class f>
struct transform;
template <template <typename...> class C, typename...Ts, template <typename> class f>
struct transform<C<Ts...>, f>
{
using type = C<typename f<Ts>::type...>;
};
static_assert(std::is_same<std::tuple<char, int>,
transform<std::tuple<char*, int*>, std::remove_pointer>::type>::value, "unexpected");
int main() {
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBmPgpzdHJ1Y3QgdHJhbnNmb3JtOwoKdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgQywgdHlwZW5hbWUuLi5UcywgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBmPgpzdHJ1Y3QgdHJhbnNmb3JtPEM8VHMuLi4+LCBmPgp7CiAgICB1c2luZyB0eXBlID0gQzx0eXBlbmFtZSBmPFRzPjo6dHlwZS4uLj47Cn07CgpzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxzdGQ6OnR1cGxlPGNoYXIsIGludD4sCiAgICAgICAgICAgICAgdHJhbnNmb3JtPHN0ZDo6dHVwbGU8Y2hhciosIGludCo+LCBzdGQ6OnJlbW92ZV9wb2ludGVyPjo6dHlwZT46OnZhbHVlLCAidW5leHBlY3RlZCIpOwoKaW50IG1haW4oKSB7Cn0K