Обратите внимание, что если вы создаете класс, вы можете создавать сообщения из любого числа типов по своему усмотрению, что означает, что вы получаете эффект, аналогичный оператору << или формату в printf (3C).Примерно так: </p>
// make sure log remains copyable
class log
{
public:
log(const char *function, const char *filename, int line)
{
f_message << function << ":" << filename << ":" << line << ": ";
}
~log()
{
//printf("%s\n", f_message.str().c_str()); -- printf?!
std::cerr << f_message.str() << std::endl;
}
log& operator () (const char *value)
{
f_message << value;
}
log& operator () (int value)
{
f_message << value;
}
// repeat with all the types you want to support in the base class
// (should be all the basic types at least)
private:
sstream f_message;
};
// start the magic here
log log_error(const char *func, const char *file, int line)
{
log l(func, file, line);
return l;
}
// NOTE: No ';' at the end here!
#define LOG_DEBUG log_error(__func__, __FILE__, __LINE__)
// usage sample:
LOG_DEBUG("found ")(count)(" items");
Обратите внимание, что вы можете объявлять операторы << вместо ().В этом случае итоговое использование будет примерно таким: </p>
LOG_DEBUG << "found " << count << " items";
Зависит от того, что вы предпочитаете использовать.Я вроде как (), потому что он защищает ваши выражения автоматически.то есть, если вы хотите вывести «count << 3», вам нужно написать: </p>
LOG_DEBUG << "found " << (count << 3) << " items";