Darf typeof (std :: endl) nicht als Template-Parameter haben?

Also habe ich versucht, eine Funktion wie diese zu schreiben:

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

und nenne es so:

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

Das geht aber nicht. Ich erhalte einen Fehler, der "zu viele Argumente" zur Funktion sagt. Ich habe es auf den Punkt eingegrenzt, den ich kennestd::endl ist schuld - wahrscheinlich, weil es eine Funktion ist. Ich habe es geschafft, dieses Problem zu lösen, indem ich eine Struktur namens deklarierteendl und definieren Sie die<<operator dafür, dass es einfach anruftstd::endl. Das funktioniert, fühlt sich aber nicht besonders gut an. Ist es nicht möglich, std :: endl als Template-Argument zu akzeptieren? Die Funktion funktioniert auch für andere Typen.

Bearbeiten: hier ist der Fehler:

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

Aktualisieren

Der Versuch, den Compiler zu veranlassen, die richtigen Vorlagenargumente abzuleiten, schlug @MooingDuck vor, eine Funktion der folgenden Form zu verwenden:

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

Dies wird jedoch nicht kompiliert.

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>

Irgendwelche Ideen warum? Um dies zu kompilieren, habe ich hinzugefügtusing namespace std;

Antworten auf die Frage(2)

Ihre Antwort auf die Frage