Я хотел бы создать функцию журнала с несколькими параметрами, и я также хочу вызвать функцию журнала с моим классом.
Вот мой код (компилятор: Visual studio 2019 или x86-64 gcc9.2)
Вопрос 1> Я не могу понять функцию журнала. Можно ли использовать такое выражение складывания? (эта функция взята из библиотеки spdlog)
Вопрос 2> Как я могу использовать функцию log с классом Mystruct?
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();
}