оператор перегрузки << для std :: tuple - возможные упрощения?

Я использовал ответ на вопрос SO "итерация по кортежу" , чтобы написать метод для перегрузки . Этот метод был протестирован и работает правильно с g ++ 4.7 в сжатии Debian.

Однако этот метод является своего рода обходным путём, поскольку кажется, что не может быть явно создан (я нашел сообщение об этом здесь ). Итак, нужно определить строковый метод, а затем вызвать его. У меня есть аналогичный метод для вектора, более прямой. Есть ли у кого-нибудь предложения о том, как избавиться от лишнего шага по созданию строкового метода, используя тот же подход или иным образом? Заранее спасибо.

#include 
#include 
#include 
#include 
#include 

using std::ostream;
using std::cout;
using std::endl;
using std::vector;
using std::string;

// Print vector.
template ostream& operator <<(ostream& out, const vector & vec)
{
  unsigned int i;
  out << "[";
  for(i=0; i
inline typename std::enable_if::type
stringval(const std::tuple & t)
{
  std::stringstream buffer;
  buffer << "]";
  return buffer.str();
}

template
inline typename std::enable_if::type
stringval(const std::tuple & t)
{
  std::stringstream buffer;
  size_t len = sizeof...(Tp);
  if(I==0)
      buffer << "[";
  buffer << std::get(t);
  if(I < len - 1)
    buffer << ", ";
  buffer << stringval(t);
  return buffer.str();
}

template ostream& operator <<(ostream& out, const std::tuple & t)
{
  out << stringval(t);
  return out;
}

int
main()
{
  typedef std::tuple T;
  std::tuple t = std::make_tuple(2, 3.14159F, 2345.678);
  cout << t << endl;
}

При компиляции это дает

[2, 3.14159, 2345.68]

7
задан Community 23 May 2017 в 10:33
поделиться