como descobrir se a cadeia de fluxo de saída está encerrada?
O que estou tentando alcançar?
Como posso descobrir se uma cadeia de fluxo é finalizada? Veja a função abaixo (todas essas funções estão dentro de uma classe LogRouter nesta pergunta):
template<typename First, typename... Rest>
void log(const LogLevel &level_, First first_, Rest... rest_) {
sstream << first_ << " ";
log(level_, rest_...);
}
void log(const LogLevel &level_) {
for(auto &route : routes)
route->stream() << sstream.str() << std::endl;
sstream.clear();
sstream.str("");
}
Desejo alcançar exatamente a mesma funcionalidade acima, mas usando fluxos. Portanto, quando chego ao final de um fluxo, ele precisa enviar os dados finais para as rotas e, em vez de usar
router.log(LogLevel::Alert, "test stream", 15);
Eu quero poder usar
router.log(LogLevel::Alert) << "test stream " << 15;
O que eu tentei:
std::ostream
sobrecarga do operador não aceita variáveis compactadas.
passando por cada valor passado, um por um. Como abaixo:
struct LogEnd {};
static LogEnd end() { return LogEnd; }
template<typename T> LogRouter &operator<<(const T &value) {
sstream << value;
return *this;
}
LogRouter &log(const LogLevel &level_) {
currentLogLevel = level_; //had to add another variable
return *this;
}
void operator<<(const LogEnd &end) {
for(auto &route : routes)
route.stream() << sstream.str() << std::endl;
currentLogLevel = LogLevel::None;
}
Isso me dá o que eu quero em termos de sintaxe, mas preciso chamar o comando adicionalLogRouter::end()
no final de cada:
router.log(LogLevel::Alert) << "test stream " << 15 << LogRouter::end();
Eu tenho uma sintaxe parastd::endl
também, mas seria melhor se eu pudesse chamá-lo sem nada no final.
Pergunta, questão
Existe uma maneira de saber o fim de uma cadeia de fluxo. Algo semelhante ao que você pode fazer ao usar a função de modelo variável recursiva.