Использование * спецификаторов ширины и точности с boost :: format - PullRequest
5 голосов
/ 05 июня 2010

Я пытаюсь использовать спецификаторы ширины и точности с boost::format, например:

#include <boost\format.hpp>
#include <string>

int main()
{
    int n = 5;
    std::string s = (boost::format("%*.*s") % (n*2) % (n*2) % "Hello").str();
    return 0;
}

Но это не работает, потому что boost::format не поддерживает спецификатор *. Boost генерирует исключение при разборе строки.

Есть ли способ достичь той же цели, предпочтительно с помощью замены?

Ответы [ 2 ]

8 голосов
/ 05 июня 2010

Попробуйте это:

#include <boost/format.hpp>
#include <iomanip>

using namespace std;
using namespace boost;

int main()
{
    int n = 5;
    string s = (format("%s") % io::group(setw(n*2), setprecision(n*2), "Hello")).str();
    return 0;
}

group () позволяет вам инкапсулировать один или несколько манипуляторов ввода-вывода с параметром.

2 голосов
/ 05 июня 2010

Ну, это не вставка, но один из способов сделать это - динамически построить строку формата:

#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>

int main()
{
    int n = 5;
    const std::string f("%" + 
                        boost::lexical_cast<std::string>(n * 2) + "." +
                        boost::lexical_cast<std::string>(n * 2) + "s");
    std::string s = (boost::format(f) % "Hello").str();
}

Конечно, если бы вы делали это часто, вы могли бы реорганизовать конструкцию строки формата в функцию.

Вы также можете использовать boost::format() для генерации строки формата; он короче, но потенциально менее читабелен, особенно для длинных строк формата:

const std::string f = (boost::format("%%%d.%ds") % (n*2) % (n*2)).str();
std::string s = (boost::format(f) % "Hello").str();

(кредит Ферруччо за публикацию второй идеи в комментариях)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...