#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";
}