#include <algorithm>
#include <functional>
#include <iostream>
#include <memory>
#include <string>
#include <type_traits>
#include <utility>
template <class T, template <class...> class TT>
struct is_instantiation_of : std::false_type
{};
template <template <class... > class TT, class... A>
struct is_instantiation_of<TT<A...>, TT> : std::true_type
{};
static_assert(is_instantiation_of<std::shared_ptr<int>, std::shared_ptr>::value, "int");
static_assert(is_instantiation_of<std::shared_ptr<double>, std::shared_ptr>::value, "double");
static_assert(is_instantiation_of<std::string, std::basic_string>::value, "str");
static_assert(!is_instantiation_of<std::shared_ptr<int>, std::weak_ptr>::value, "NO");
int main()
{
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDxjbGFzcyBULCB0ZW1wbGF0ZSA8Y2xhc3MuLi4+IGNsYXNzIFRUPgpzdHJ1Y3QgaXNfaW5zdGFudGlhdGlvbl9vZiA6IHN0ZDo6ZmFsc2VfdHlwZQp7fTsKCnRlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MuLi4gPiBjbGFzcyBUVCwgY2xhc3MuLi4gQT4Kc3RydWN0IGlzX2luc3RhbnRpYXRpb25fb2Y8VFQ8QS4uLj4sIFRUPiA6IHN0ZDo6dHJ1ZV90eXBlCnt9OwoKc3RhdGljX2Fzc2VydChpc19pbnN0YW50aWF0aW9uX29mPHN0ZDo6c2hhcmVkX3B0cjxpbnQ+LCBzdGQ6OnNoYXJlZF9wdHI+Ojp2YWx1ZSwgImludCIpOwpzdGF0aWNfYXNzZXJ0KGlzX2luc3RhbnRpYXRpb25fb2Y8c3RkOjpzaGFyZWRfcHRyPGRvdWJsZT4sIHN0ZDo6c2hhcmVkX3B0cj46OnZhbHVlLCAiZG91YmxlIik7CnN0YXRpY19hc3NlcnQoaXNfaW5zdGFudGlhdGlvbl9vZjxzdGQ6OnN0cmluZywgc3RkOjpiYXNpY19zdHJpbmc+Ojp2YWx1ZSwgInN0ciIpOwpzdGF0aWNfYXNzZXJ0KCFpc19pbnN0YW50aWF0aW9uX29mPHN0ZDo6c2hhcmVkX3B0cjxpbnQ+LCBzdGQ6OndlYWtfcHRyPjo6dmFsdWUsICJOTyIpOwoKaW50IG1haW4oKQp7Cn0=