#include <type_traits>

template<typename T>
struct extract_value_type
{
    typedef T value_type;
};

template<template<typename> class X, typename T>
struct extract_value_type <X<T>>   //specialization
{
    typedef T value_type;
};

/////////////////////////////

struct X {};
template <typename T> struct Y {};

template<typename C, typename T>
void test()
{
   typedef typename extract_value_type<C>::value_type value_type;
   static_assert(std::is_same<value_type, T>::value, "mismatched");
}

int main()
{
   test<X,X>();
   test<Y<X>,X>();
}