Вы знаете, использование пользовательского делетера - не лучший способ, так как вам придется упомянуть его по всему вашему коду. Вместо этого , поскольку вам разрешено добавлять специализации к классам уровня пространства имен в ::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 };
}
ОБНОВЛЕНИЕ: Как я видел, вы не хотели выравнивать только второе поле. Но если вы жестко проводите поля, вы можете отформатировать их самостоятельно. Если они передаются вам как строки, они могут обрабатываться тем же методом, что и ваши двойники.
Поскольку вы хотите выровнять десятичные точки по результатам, вы должны сделать это самостоятельно из того, что я понимаю. Вспомогательная структура удерживает его в стороне и может использоваться повторно.
#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
Насколько я знаю, нет быстрого способа сделать это с помощью 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/ - короткая версия