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;