#include <tuple>
#include <type_traits>
#include <vector>
template<typename T>
struct innermost_impl
{
using type = T;
};
template<template<typename> class E, typename T>
struct innermost_impl<E<T>>
{
using type = typename innermost_impl<T>::type;
};
template<template<typename...> class E, typename... Ts>
struct innermost_impl<E<Ts...>>
{
using type = std::tuple<typename innermost_impl<Ts>::type...>;
};
template<typename T>
using innermost = typename innermost_impl<T>::type;
static_assert(std::is_same<innermost<std::vector<std::vector<std::vector<int>>>>, int>::value, "");
int main()
{
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgaW5uZXJtb3N0X2ltcGwKewogICAgdXNpbmcgdHlwZSA9IFQ7Cn07Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgRSwgdHlwZW5hbWUgVD4Kc3RydWN0IGlubmVybW9zdF9pbXBsPEU8VD4+CnsKICAgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBpbm5lcm1vc3RfaW1wbDxUPjo6dHlwZTsKfTsKCnRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBFLCB0eXBlbmFtZS4uLiBUcz4Kc3RydWN0IGlubmVybW9zdF9pbXBsPEU8VHMuLi4+Pgp7CiAgICB1c2luZyB0eXBlID0gc3RkOjp0dXBsZTx0eXBlbmFtZSBpbm5lcm1vc3RfaW1wbDxUcz46OnR5cGUuLi4+Owp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgaW5uZXJtb3N0ID0gdHlwZW5hbWUgaW5uZXJtb3N0X2ltcGw8VD46OnR5cGU7CgpzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxpbm5lcm1vc3Q8c3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4+PiwgaW50Pjo6dmFsdWUsICIiKTsKCmludCBtYWluKCkKewp9
prog.cpp:26:1: error: static assertion failed:
static_assert(std::is_same<innermost<std::vector<std::vector<std::vector<int>>>>, int>::value, "");
^