#include <iostream>
#include <type_traits>
#include <array>
#include <vector>
using namespace std;
 
template<typename T>
struct is_class_template : std::false_type { };
 
template<template <typename...> class T, typename... Args>
struct is_class_template<T<Args...>> : std::true_type { };
 
struct foo {};
 
int main() {
    std::cout << std::boolalpha;
    std::cout << is_class_template<bool>::value << std::endl; // false, correct
    std::cout << is_class_template<foo>::value << std::endl;  // false, correct
    std::cout << is_class_template<std::vector<int>>::value << std::endl; // true, correct
 
    std::cout << is_class_template<std::array<int, 2>>::value << std::endl; // false, NOT correct, why?
 
    return 0;
}