
template < typename T > // T is a type
    typename T::value_type // T::value_type is a type
        front( T& c )
            { return c.front() ; } // T has a member 'front' which is callable

struct A
{
    using value_type = const int* ;
    value_type front() const { return &value ; }
    int value = 8 ;
};

#include <vector>
#include <iostream>

int main ()
{
    std::vector<int> cntr { 1234, -7, 345, 6789 } ;
    std::cout << front(cntr) << '\n' ; // T => std::vector<int>, T::value_type => int

    A a ;
    std::cout << front(a) << '\n' ; // T => A, T::value_type => const int*
}
