Используя C ++ fmtlib, есть ли более чистый способ добавить последовательность данных в строку, чем использование std :: ostringstream? - PullRequest
0 голосов
/ 04 июня 2019

Пакет fmtlib обеспечивает чистый, читаемый и быстрый способ форматирования строковых данных в C ++, но я не могу найти чистый и читаемый способ использовать его для добавления последовательности данных в строку.

После долгих поисков я придумал рабочее решение, но оно гораздо более многословно, чем использование стандартного подхода потоков std и шевронов. Я не могу привести ни одного / многих примеров этого с использованием fmtlib, поэтому я надеюсь, что какой-нибудь эксперт знает, как сделать это более аккуратно.

 // Here is an fmtlib version of dump_line.  I don't like it.  using 'cout' seems cleaner and simpler.
virtual void dump_line( const char* msg, uint8_t* dataline )
{
  fmt::memory_buffer out;
  format_to(out, "{} :", msg);
  for( int jj=0; jj<m_cacheStore.p_LineSize; jj++) {
    format_to(out, " [{}]={}", jj, (int)dataline[jj] );
  }
  fmt::print("{}\n",fmt::to_string(out) );
}

// Here is the typical approach using cout and chevrons.
// Nice and simple. 
virtual void dump_line( const char* msg, uint8_t* dataline )
{
  cout << msg << " : " ;
  for( int jj=0; jj<m_cacheStore.p_LineSize; jj++)
    cout << " [" << jj << "]=" << (int)dataline[jj];
  cout<<endl;
}

Я просто вывожу массив int в stdout, чтобы он выглядел так: [0] = 2 [1] = 0 [2] = 0 [3] = 0 [4] = 1 [5] = 0 [6] = 0 [7] = 0

1 Ответ

1 голос
/ 23 июня 2019

Вы можете записать в выходной поток напрямую без промежуточного буфера:

virtual void dump_line(const char* msg, uint8_t* dataline) {
  fmt::print("{} :", msg);
  for (int jj=0; jj<m_cacheStore.p_LineSize; jj++) {
    fmt::print(" [{}]={}", jj, dataline[jj]);
  }
  fmt::print("\n");
}

Обратите внимание, что вам не нужно приводить dataline[jj] к int, потому что, в отличие от iostreams, {fmt} правильно обрабатывает uint8_t.

Если вы хотите построить строку, вы можете записать в memory_buffer или передать back_insert_iterator в format_to.

...