Background
So, today I used a thin shell for std::ofstream, which made it easy for me to write .csv files. I wanted to redefine a statement <<to write a value followed by a comma, and then when the time came for a new line, I would print a backspace character and then a new line. I decided to implement the new line behavior as a custom template as follows:
class CsvWriter {
public:
CsvWriter(const char *fname, std::vector<const char *> headers);
CsvWriter() = delete;
CsvWriter(const CsvWriter &) = delete;
CsvWriter &operator=(const CsvWriter &) = delete;
~CsvWriter() = default;
static struct LineBreak {} BREAK;
template <typename T>
CsvWriter &operator<<(T t);
private:
std::ofstream out_;
bool first_ = true;
};
template <typename T>
CsvWriter &CsvWriter::operator<<(T t) {
if (!first_) {
out_ << ',';
} else {
first_ = false;
}
out_ << t;
return *this;
}
template <>
CsvWriter &CsvWriter::operator<<(LineBreak) {
out_ << std::endl;
first_ = true;
return *this;
}
CsvWriter::CsvWriter(const char *fname, std::vector<const char *> headers)
: out_(fname) {
for (const char *header : headers) {
*this << header;
}
*this << BREAK;
}
Brief explanation
, , gcc. , BREAK. , , &CsvWriter::BREAK ( , -, ). , , CsvWriter::LineBreak CsvWriter::BREAK; , &CsvWriter::BREAK ( , .
, , - , . (, ), .
, , , ++ 11? ? , ?