Выровнять десятичные знаки в выводе?

Вы знаете, использование пользовательского делетера - не лучший способ, так как вам придется упомянуть его по всему вашему коду. Вместо этого , поскольку вам разрешено добавлять специализации к классам уровня пространства имен в ::std, пока задействуются пользовательские типы, и вы уважаете семантику, сделайте следующее:

Специализируйте std::default_delete :

template <>
struct ::std::default_delete {
    default_delete() = default;
    template ()>>
    constexpr default_delete(default_delete) noexcept {}
    void operator()(Bar* p) const noexcept { destroy(p); }
};

И, возможно, также std::make_unique() :

template <>
inline ::std::unique_ptr ::std::make_unique() {
    auto p = create();
    if (!p) throw std::runtime_error("Could not `create()` a new `Bar`.");
    return { p };
}

0
задан 1201ProgramAlarm 17 January 2019 в 00:44
поделиться

2 ответа

ОБНОВЛЕНИЕ: Как я видел, вы не хотели выравнивать только второе поле. Но если вы жестко проводите поля, вы можете отформатировать их самостоятельно. Если они передаются вам как строки, они могут обрабатываться тем же методом, что и ваши двойники.

Поскольку вы хотите выровнять десятичные точки по результатам, вы должны сделать это самостоятельно из того, что я понимаю. Вспомогательная структура удерживает его в стороне и может использоваться повторно.

    #include <iomanip>
    #include <cmath>
    #include <iostream>

    struct buf
    {
        double val;
        buf(double val) :val(val) {}
        friend std::ostream& operator<< (std::ostream& os, buf b) {
            for (double i = b.val; i < 1000; i*=10) os << " ";
            return os << b.val;
        }
    };

int main() {
    //
    double gaslawPressure = 1.615;
    double pointDistance = 221.615;
    std::cout << std::setw(20) << std::left << std::setfill('.')
        << "Equation #01" << "Ideal Gas Law(Chemistry) : " << buf(gaslawPressure)<<" atm" << std::endl;

    //printing the calculated distance
    std::cout << std::setw(20) << std::left << std::setfill('.')
        << "Equation #02" << "Distance Formula(Math)   : "<< buf(pointDistance)<< std::endl;

        return 0;
}

Выход:

Equation #01........Ideal Gas Law(Chemistry) :    1.615 atm
Equation #02........Distance Formula(Math)   :  221.615
0
ответ дан lakeweb 17 January 2019 в 00:44
поделиться

Насколько я знаю, нет быстрого способа сделать это с помощью isstream / iomanip

Точность не определяет длину дробной части, а количество всех цифр.

Я понимаю, вам нужно правильно дополнить значения. В этом случае решение является sprintf из [cstdio]. Это должно выглядеть примерно так:

sprintf (YourBuffer, "% 10.3f", YourVariable);

https://en.cppreference.com/w/cpp/io / c / fprintf

http://www.cplusplus.com/reference/cstdio/printf/ - короткая версия

0
ответ дан Utututu 17 January 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: