Не может иметь typeof(std::endl) в качестве параметра шаблона?

Итак, я пытался написать такую функцию:

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и определив <для нее так, чтобы она просто вызывала 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>]’

Update

Пытаясь заставить компилятор вывести правильные аргументы шаблона @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’

Есть идеи, почему? Чтобы скомпилировать это, я добавил с использованием пространства имен std;

10
задан Max 4 April 2012 в 19:55
поделиться