#include <type_traits>
#include <iostream>
#include <memory>
template<template<typename> class X, typename T> struct instantiation_of : public std::false_type {};
template<template<typename> class X, typename Y> struct instantiation_of<X, X<Y>> : public std::true_type {};
int main() {
std::cout << instantiation_of<std::shared_ptr, int>::value << "\n";
std::cout << instantiation_of<std::shared_ptr, std::shared_ptr<int>>::value << "\n";
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtZW1vcnk+Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgWCwgdHlwZW5hbWUgVD4gc3RydWN0IGluc3RhbnRpYXRpb25fb2YgOiBwdWJsaWMgc3RkOjpmYWxzZV90eXBlIHt9Owp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgWCwgdHlwZW5hbWUgWT4gc3RydWN0IGluc3RhbnRpYXRpb25fb2Y8WCwgWDxZPj4gOiBwdWJsaWMgc3RkOjp0cnVlX3R5cGUge307CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6Y291dCA8PCBpbnN0YW50aWF0aW9uX29mPHN0ZDo6c2hhcmVkX3B0ciwgaW50Pjo6dmFsdWUgPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCBpbnN0YW50aWF0aW9uX29mPHN0ZDo6c2hhcmVkX3B0ciwgc3RkOjpzaGFyZWRfcHRyPGludD4+Ojp2YWx1ZSA8PCAiXG4iOwp9