だから、私はこのような関数を書こうとしていました:
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...);
}
そしてそれを次のように呼び出します:
append_to_stream(stream,
std::endl,
std::endl);
しかし、これはうまくいきません。関数の「引数が多すぎます」というエラーが表示されます。std::endl
おそらくそれが関数であるため、有罪であることがわかっているところまで絞り込みました。と呼ばれる構造体を宣言し、それに対してendl
を定義して<<operator
、単に を呼び出すようにすることで、これを「解決」することができましstd::endl
た。これは機能しますが、特に気分が良くありません。std::endl をテンプレート引数として受け入れることはできませんか? この機能は他のタイプでも機能します。
編集:ここにエラーがあります:
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>]’
アップデート
コンパイラに正しいテンプレート引数 @MooingDuck を推測させようとすると、次の形式の関数を使用できることが示唆されました。
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>;
}
ただし、これはコンパイルされません。
エラー:
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’
理由はありますか?これをコンパイルするために、追加しましたusing namespace std;