I'd like make a log function with multiple parameters, and I also want to call the log function with my class.
Here is my code (compiler : Visual studio 2019 or x86-64 gcc9.2)
Question 1> I cannot understand log function. Is it possible to use fold expression like this ? (this function comes from spdlog library)
Question 2>
How could I use the log function with Mystruct class ?
log(1, MyStruct(1, 1.1f, "hello world"s)); // compiler error
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
template<typename ... Args>
void log(int level, Args const& ... args)
{
std::ostringstream stream;
using List = int[];
(void)List {
0, ((void)(stream << args), 0) ...
};
std::cout << stream.str() << std::endl;
}
class MyStruct
{
public:
int val1 = 0;
float val2 = 0.f;
std::string val3;
MyStruct(int v1, float v2, std::string_view const& v3) : val1(v1), val2(v2), val3(v3) {};
std::string to_string() const
{
std::stringstream stream;
stream << "val1=" << val1 << ", val2=" << val2 << ",val3=" << val3;
return stream.str();
}
};
std::ostringstream& operator<< (std::ostringstream& stream, MyStruct&& val)
{
auto str = val.to_string();
std::operator <<(stream, str);
return stream;
}
void work_good()
{
using namespace std::string_literals;
log(1, 1.1f, "hello world"s);
}
void compile_error()
{
using namespace std::string_literals;
log(1, MyStruct(1, 1.1f, "hello world"s));
}
int main()
{
work_good();
}