#include <iostream>
#include <vector>
#include <map>
template<typename T>
struct MyFirstElement;
template<template<typename...> class T_Container, typename T_Type, typename... Ts>
struct MyFirstElement<T_Container<T_Type,Ts...>>{
using Type = T_Type;
};
//unit test
using MustBeInt = typename MyFirstElement<std::vector<int>>::Type;
using MustBeLong = typename MyFirstElement<std::map<long,float>>::Type;
static_assert(std::is_same<MustBeInt,int>::value,"");
static_assert(std::is_same<MustBeLong,long>::value,"");
//this works too even though its not an STL container
template<typename T, typename U, typename Z>
struct MyCrazyContainer{};
static_assert(std::is_same<typename MyFirstElement<MyCrazyContainer<bool,long,float>>::Type,bool>::value,"");
int main() {
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdHJ1Y3QgTXlGaXJzdEVsZW1lbnQ7CiAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gY2xhc3MgVF9Db250YWluZXIsIHR5cGVuYW1lIFRfVHlwZSwgdHlwZW5hbWUuLi4gVHM+CiAgICBzdHJ1Y3QgTXlGaXJzdEVsZW1lbnQ8VF9Db250YWluZXI8VF9UeXBlLFRzLi4uPj57CiAgICAJdXNpbmcgVHlwZSA9IFRfVHlwZTsKICAgIH07CiAgICAKICAgIC8vdW5pdCB0ZXN0CiAgICB1c2luZyBNdXN0QmVJbnQgPSB0eXBlbmFtZSBNeUZpcnN0RWxlbWVudDxzdGQ6OnZlY3RvcjxpbnQ+Pjo6VHlwZTsKICAgIHVzaW5nIE11c3RCZUxvbmcgPSB0eXBlbmFtZSBNeUZpcnN0RWxlbWVudDxzdGQ6Om1hcDxsb25nLGZsb2F0Pj46OlR5cGU7CiAgICAKICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPE11c3RCZUludCxpbnQ+Ojp2YWx1ZSwiIik7CiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxNdXN0QmVMb25nLGxvbmc+Ojp2YWx1ZSwiIik7IAoKICAgIC8vdGhpcyB3b3JrcyB0b28gZXZlbiB0aG91Z2ggaXRzIG5vdCBhbiBTVEwgY29udGFpbmVyCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBaPgogICAgc3RydWN0IE15Q3JhenlDb250YWluZXJ7fTsKICAgIAogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgTXlGaXJzdEVsZW1lbnQ8TXlDcmF6eUNvbnRhaW5lcjxib29sLGxvbmcsZmxvYXQ+Pjo6VHlwZSxib29sPjo6dmFsdWUsIiIpOwoKaW50IG1haW4oKSB7CglyZXR1cm4gMDsKfQ==