Nie można mieć typeof (std :: endl) jako parametru szablonu?
Próbowałem napisać taką funkcję:
<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>
i nazwij to tak:
<code>append_to_stream(stream, std::endl, std::endl); </code>
Ale to nie działa. Dostaję błąd, który mówi „zbyt wiele argumentów” do funkcji. Zawęziłem to do punktu, w którym wiem, żestd::endl
jest winny - prawdopodobnie dlatego, że to funkcja. Udało mi się to „rozwiązać” poprzez zadeklarowanie wywołanej strukturyendl
i zdefiniuj<<operator
za to po prostu dzwonistd::endl
. To działa, ale nie jest szczególnie dobre. Czy nie można zaakceptować std :: endl jako argumentu szablonu? Funkcja działa dla innych typów.
Edytuj: oto błąd:
<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>
Aktualizacja
Próbując skłonić kompilator do wywnioskowania poprawnych argumentów szablonu @MooingDuck zasugerował, że można użyć funkcji następującego formularza:
<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>
Jednak to się nie kompiluje.
Błąd:
<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>
Jakieś pomysły dlaczego? W celu skompilowania tego dodałemusing namespace std;