#include <iostream>
#include <type_traits>
#include <vector>
#include <list>
using namespace std;
template<template<class,class> class C>
struct is_vector1 : std::false_type { };
template<>
struct is_vector1<std::vector> : std::true_type { };
template<typename T>
struct is_vector2 : false_type { };
template<typename E, typename A>
struct is_vector2<vector<E, A>> : true_type { };
template<template<class, class> class T>
typename enable_if<!is_vector1<T>::value, char>::type is_vectorf();
template<template<class, class> class T>
typename enable_if<is_vector1<T>::value, char(&)[2]>::type is_vectorf();
template<typename T>
typename enable_if<!is_vector2<T>::value, char>::type is_vectorf();
template<typename T>
typename enable_if<is_vector2<T>::value, char(&)[2]>::type is_vectorf();
#define is_vector(T) ::std::integral_constant<bool, sizeof(::is_vectorf<T>()) != 1>
int main() {
cout << (is_vector(list)::value ? "is vector\n" : "no vector\n");
cout << (is_vector(vector)::value ? "is vector\n" : "no vector\n");
cout << (is_vector(list<int>)::value ? "is vector\n" : "no vector\n");
cout << (is_vector(vector<int>)::value ? "is vector\n" : "no vector\n");
cout << (is_vector(int)::value ? "is vector\n" : "no vector\n");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxsaXN0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsY2xhc3M+IGNsYXNzIEM+CnN0cnVjdCBpc192ZWN0b3IxIDogc3RkOjpmYWxzZV90eXBlIHsgfTsKCnRlbXBsYXRlPD4Kc3RydWN0IGlzX3ZlY3RvcjE8c3RkOjp2ZWN0b3I+IDogc3RkOjp0cnVlX3R5cGUgeyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGlzX3ZlY3RvcjIgOiBmYWxzZV90eXBlIHsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lIEE+CnN0cnVjdCBpc192ZWN0b3IyPHZlY3RvcjxFLCBBPj4gOiB0cnVlX3R5cGUgeyB9OwoKdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBUPgp0eXBlbmFtZSBlbmFibGVfaWY8IWlzX3ZlY3RvcjE8VD46OnZhbHVlLCBjaGFyPjo6dHlwZSBpc192ZWN0b3JmKCk7Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIFQ+CnR5cGVuYW1lIGVuYWJsZV9pZjxpc192ZWN0b3IxPFQ+Ojp2YWx1ZSwgY2hhcigmKVsyXT46OnR5cGUgaXNfdmVjdG9yZigpOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdHlwZW5hbWUgZW5hYmxlX2lmPCFpc192ZWN0b3IyPFQ+Ojp2YWx1ZSwgY2hhcj46OnR5cGUgaXNfdmVjdG9yZigpOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdHlwZW5hbWUgZW5hYmxlX2lmPGlzX3ZlY3RvcjI8VD46OnZhbHVlLCBjaGFyKCYpWzJdPjo6dHlwZSBpc192ZWN0b3JmKCk7CgojZGVmaW5lIGlzX3ZlY3RvcihUKSA6OnN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc2l6ZW9mKDo6aXNfdmVjdG9yZjxUPigpKSAhPSAxPgoKaW50IG1haW4oKSB7Cgljb3V0IDw8IChpc192ZWN0b3IobGlzdCk6OnZhbHVlID8gImlzIHZlY3RvclxuIiA6ICJubyB2ZWN0b3JcbiIpOwoJY291dCA8PCAoaXNfdmVjdG9yKHZlY3Rvcik6OnZhbHVlID8gImlzIHZlY3RvclxuIiA6ICJubyB2ZWN0b3JcbiIpOwoJY291dCA8PCAoaXNfdmVjdG9yKGxpc3Q8aW50Pik6OnZhbHVlID8gImlzIHZlY3RvclxuIiA6ICJubyB2ZWN0b3JcbiIpOwoJY291dCA8PCAoaXNfdmVjdG9yKHZlY3RvcjxpbnQ+KTo6dmFsdWUgPyAiaXMgdmVjdG9yXG4iIDogIm5vIHZlY3RvclxuIik7Cgljb3V0IDw8IChpc192ZWN0b3IoaW50KTo6dmFsdWUgPyAiaXMgdmVjdG9yXG4iIDogIm5vIHZlY3RvclxuIik7Cn0=