web-dev-qa-db-fra.com

Formatage de chaîne C++ comme Python "{}". Format

Je cherche un moyen rapide et pratique d’imprimer dans un format de tableau agréable avec des cellules alignées correctement.

Existe-t-il un moyen pratique en c ++ de créer des chaînes de sous-chaînes d'une certaine longueur, comme le format python?

"{:10}".format("some_string")
8
chrise

Vous avez beaucoup d'options ici. Par exemple, en utilisant des flux.

source.cpp

  std::ostringstream stream;
  stream << "substring";
  std::string new_string = stream.str();
3
lllShamanlll

Essayez ceci https://github.com/fmtlib/fmt

fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
std::string s = fmt::format("{0}{1}{0}", "abra", "cad");
10
mattn

Si vous ne pouvez pas utiliser fmt comme indiqué ci-dessus, le meilleur moyen consiste à utiliser une classe wrapper pour le formatage. Voici ce que j'ai fait une fois:

#include <iomanip>
#include <iostream>

class format_guard {
  std::ostream& _os;
  std::ios::fmtflags _f;

public:
  format_guard(std::ostream& os = std::cout) : _os(os), _f(os.flags()) {}
  ~format_guard() { _os.flags(_f); }
};

template <typename T>
struct table_entry {
  const T& entry;
  int width;
  table_entry(const T& entry_, int width_)
      : entry(entry_), width(static_cast<int>(width_)) {}
};

template <typename T>
std::ostream& operator<<(std::ostream& os, const table_entry<T>& e) {
  format_guard fg(os);
  return os << std::setw(e.width) << std::right << e.entry; 
}

Et vous l'utiliseriez comme std::cout << table_entry("some_string", 10). Vous pouvez adapter table_entry à vos besoins. Si vous ne disposez pas de déduction d'argument de modèle de classe, vous pouvez implémenter une fonction make_table_entry pour la déduction de type de modèle.

Le format_guard est nécessaire car certaines options de formatage sur std::ostream sont persistantes.

0
sv90