Não é possível ter o typeof (std :: endl) como parâmetro de modelo?
Então, eu estava tentando escrever uma função como esta:
<code>void append_to_stream(std::ostream &stream) { } template <typename T, typename... Args> void append_to_stream(std::ostream &stream, T first, Args&&... rest) { stream << first; append_to_stream(stream, rest...); } </code>
e chamá-lo como:
<code>append_to_stream(stream, std::endl, std::endl); </code>
Mas isso não funciona. Eu recebo um erro que diz "muitos argumentos" para a função. Eu reduzi ao ponto que eu sei que ostd::endl
é culpado - provavelmente porque é uma função. Eu consegui 'resolver' isso declarando uma estrutura chamadaendl
e definir o<<operator
por isso para que ele simplesmente chamastd::endl
. Isso funciona, mas não parece particularmente bom. Não é possível aceitar std :: endl como um argumento de modelo? A função funciona para outros tipos.
Edit: aqui está o erro:
<code>src/log/sinks/file_sink.cpp:62:21: error: too many arguments to function ‘void log::sinks::append_to_stream(std::string&, Args&& ...) [with Args = {}, std::string = std::basic_string<char>]’ </code>
Atualizar
Tentando fazer com que o compilador deduzisse os argumentos de template corretos, @MooingDuck sugeriu que uma função da seguinte forma poderia ser usada:
<code> template<class e, class t, class a> basic_ostream<e,t>&(*)(basic_ostream<e,t>&os) get_endl(basic_string<e,t,a>& s) { return std::endl<e,t>; } </code>
No entanto, isso não compila.
Erro:
<code>src/log/sinks/file_sink.cpp:42:28: error: expected unqualified-id before ‘)’ token src/log/sinks/file_sink.cpp:42:53: error: expected initializer before ‘get_endl’ </code>
Alguma idéia por quê? Para compilar isso, eu adicioneiusing namespace std;