

#include <string>
#include <iostream>

uint length(char *str)
{
    int i = 0;
    for (; str[i]; ++i);
    return i;
}

template <typename T> uint length(std::basic_string<T> & str)
{
    return str.length();
}


char charAt(char *str, uint pos)
{
    if (pos > length(str))
        return 0;
    return str[pos];
}

template <typename T> T charAt(std::basic_string<T> & str, uint pos)
{
    if (pos > length(str))
        return 0;
    return str[pos];
}

template <typename T> void printRev(T str)
{
    uint l = length(str);

    for (int i = 0; i < l; ++i)
        std::cout << charAt(str, l-1-i);

    std::cout << std::endl;
}

int main (int argc, char ** argv)
{

    char array[] = "This is an ARRAY";
    std::string s("This is an STL_String");

    std::cout << "\"" << array << "\" has length: " << length(array) << std::endl;
    std::cout << "\"" << s << "\" has length: " << length(s) << std::endl;

    std::cout << "\"" << array << "\" has " << charAt(array, 8) <<
                 " at position 8 \n";
    std::cout << "\"" << s << "\" has " << charAt(s,20) <<
                 " at position 20\n";

    std::cout << "\"" << array << "\" reversed is: ";
    printRev(array);
    std::cout << "\"" << s << "\" reversed is: ";
    printRev(s);

}
