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.

questionAnswers(1)

yourAnswerToTheQuestion