¿No puede tener typeof (std :: endl) como parámetro de plantilla?

Entonces, estaba tratando de escribir una función 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>

y llámalo como

<code>append_to_stream(stream, 
                 std::endl,
                 std::endl);
</code>

Pero esto no funciona. Recibo un error que dice 'demasiados argumentos' a la función. Lo he reducido hasta el punto en que sé que elstd::endl es culpable - probablemente porque es una función. Logré "resolver" esto declarando una estructura llamadaendl y definir el<<operator por ello para que simplemente llamestd::endl. Esto funciona pero no se siente particularmente bien. ¿No es posible aceptar std :: endl como un argumento de plantilla? La función funciona para otros tipos.

Edición: aquí está el error:

<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>

Actualizar

Intentando que el compilador deduzca los argumentos de plantilla correctos, @MooingDuck sugirió que se podría utilizar una función del siguiente formulario:

<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>

Sin embargo, esto no se compila.

Error:

<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>

¿Alguna idea de por qué? Por el bien de compilar esto, he agregadousing namespace std;

Respuestas a la pregunta(2)

Su respuesta a la pregunta