#include <iostream>
#include <sstream>

#define DebugVars(...) DEBUG_VARS(__FILE__, __LINE__, __FUNCTION__, #__VA_ARGS__,__VA_ARGS__)

void Log(const char* file, const int line, const char* func, const std::string& message)
{
    printf("file:%s, line:%d, func:%s, message:%s \n", file, line, func, message.c_str());
}

template < typename... Args>
void DEBUG_VARS(const char* file, const int line, const char* func, const std::string& names, Args&&... args)
{
    
    std::stringstream names_ss;
	for (const char& c : names )
	{
		if (c == ','){
			names_ss << " ";
			continue;
		}
		names_ss << c;
	}
	
	std::string name;
    std::ostringstream ss;
    ss << "\n";
    using expander = int[];
    (void) expander { 0, (
          names_ss >> name, ss << name << ": " << args << "\n"

    ,0) ...};
    Log(file, line, func, ss.str());
    
}

int main()
{
    int number = 37;
    float pie = 3.14;
    std::string str = "test string";

    DebugVars(number, pie, str);
    return 0;
}
