#include <iostream>
#include <string>
#include <type_traits>
//ひとつのメタ関数を受け取る
template <template <typename> class Ty>
struct condition {
template <typename T>
using apply = Ty<T>;
};
template<template<typename T, typename U> class aaa, typename bind1st_type>
struct binder
{
template<typename T>
using type = aaa<bind1st_type, T>;
};
struct string2 : std::string {};
int main()
{
using condition1 = condition<std::is_pointer>;
std::cout << condition1::apply<int>::value << std::endl;
std::cout << condition1::apply<int*>::value << std::endl;
using condition2 = condition<binder<std::is_base_of, std::string>::type>;
std::cout << condition2::apply<int>::value << std::endl;
std::cout << condition2::apply<string2>::value << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgovL+OBsuOBqOOBpOOBruODoeOCv+mWouaVsOOCkuWPl+OBkeWPluOCiwp0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBUeT4Kc3RydWN0IGNvbmRpdGlvbgl7Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXVzaW5nIGFwcGx5ID0gVHk8VD47Cn07Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBjbGFzcyBhYWEsIHR5cGVuYW1lIGJpbmQxc3RfdHlwZT4Kc3RydWN0IGJpbmRlcgp7Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJdXNpbmcgdHlwZSA9IGFhYTxiaW5kMXN0X3R5cGUsIFQ+Owp9OwoKc3RydWN0IHN0cmluZzIgOiBzdGQ6OnN0cmluZyB7fTsKCmludCBtYWluKCkKewoJdXNpbmcgY29uZGl0aW9uMSA9IGNvbmRpdGlvbjxzdGQ6OmlzX3BvaW50ZXI+OwoJc3RkOjpjb3V0IDw8IGNvbmRpdGlvbjE6OmFwcGx5PGludD46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBjb25kaXRpb24xOjphcHBseTxpbnQqPjo6dmFsdWUgPDwgc3RkOjplbmRsOwoJCgl1c2luZyBjb25kaXRpb24yID0gY29uZGl0aW9uPGJpbmRlcjxzdGQ6OmlzX2Jhc2Vfb2YsIHN0ZDo6c3RyaW5nPjo6dHlwZT47CglzdGQ6OmNvdXQgPDwgY29uZGl0aW9uMjo6YXBwbHk8aW50Pjo6dmFsdWUgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGNvbmRpdGlvbjI6OmFwcGx5PHN0cmluZzI+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGw7Cn0K