#include <iostream>
#include <string>
#include <typeinfo>
typedef char const *pchar;
template<typename T> struct TypeName {
    static std::string Get() { return "unknown"; }
};
template<> struct TypeName<int> {
    static std::string Get() { return "int"; }
};
template<> struct TypeName<double> {
    static std::string Get() { return "double"; }   
};
template<> struct TypeName<std::string> {
    static std::string Get() { return "string"; }   
};

template<> struct TypeName<char*> {
    static std::string Get() { return "char*"; }    
};

template<std::size_t N> struct TypeName<char[N]> {
    static std::string Get() { return "char[N]"; }  
};
template<std::size_t N> struct TypeName<const char[N]> {
    static std::string Get() { return "const char[N]"; }    
};
void myprint()
{
}

template <typename T, typename... Args>
void myprint(const T& value, const Args&... args)
{
    std::cout << TypeName<T>::Get() << ": " << value << std::endl;
    myprint(args...);
}

int main()
{
    char *s = "adsf";
    std::string some_str = "some string";
    myprint(5, 4.0, "asdf", 1, s, some_str);
    
    return 0;
}
