Я использую Visual C ++ 2019 с C ++ 20.
У меня есть пользовательский тип Rational . Мне удалось создать пользовательский форматер для создания значений std :: string . Теперь я хотел бы создать форматер для значений std :: wstring . В зависимости от настройки, я либо получаю «попытку ссылаться на удаленную функцию», либо «невозможно разрешить перегрузку». 1-5/8 .
static const std::vector supers{ L'\u2070', L'\u00B9', L'\u00B2', L'\u00B3', L'\u2074', L'\u2075',
L'\u2076', L'\u2077', L'\u2078', L'\u2079', L'\u207A', L'\u207B' };
#include
template struct std::formatter
{
bool isHex{ false };
bool isFraction{ false };
bool isFloat{ false };
constexpr auto parse (std::format_parse_context &ctx)
{
auto pos = ctx.begin ();
while ((pos != ctx.end ()) && (*pos != '}'))
{
if (('f' == *pos) || ('F' == *pos))
isFloat = true;
if (('h' == *pos) || ('H' == *pos))
isHex = true;
if (('r' == *pos) || ('R' == *pos))
{
isFraction = true;
}
++pos;
}
return pos; // expect `}` at this position, otherwise,
// it's error! exception!
;
}
auto format (const Rational &obj, std::format_context &ctx) const
{
if (1 == obj.den)
return std::format_to (ctx.out (), "{0}", obj.num);
if (isFloat)
return std::format_to (ctx.out (), "{0:f}", (float) obj.num / obj.den);
if (isFraction)
{
if (std::abs (obj.num) > obj.den)
{
lldiv_t q = std::div ((long long) obj.num, (long long) obj.den);
return std::format_to (ctx.out (), "{0}-{1}/{2}", q.quot, q.rem, obj.den);
}
}
return std::format_to (ctx.out (), "{0}/{1}", obj.num, obj.den);
}
};
#if 0
template
struct std::formatter: std::formatter{
bool isHex{ false };
bool isFraction{ false };
bool isFloat{ false };
/* constexpr*/ auto parse (std::wformat_parse_context &ctx)
{
auto pos = ctx.begin ();
while ((pos != ctx.end ()) && (*pos != L'}'))
{
if ((L'f' == *pos) || (L'F' == *pos))
isFloat = true;
if ((L'h' == *pos) || (L'H' == *pos))
isHex = true;
if ((L'r' == *pos) || (L'R' == *pos))
{
isFraction = true;
}
++pos;
}
return pos; // expect `}` at this position, otherwise,
// it's error! exception!
;
}
auto format (const Rational &obj, std::wformat_context &ctx) const
{
if (1 == obj.den)
return std::format_to (ctx.out (), L"{0}", obj.num, obj.den);
if (isFloat)
return std::format_to (ctx.out (), L"{0}/{1}", obj.num, obj.den);
if (isFraction)
{
auto temp = obj.num;
std::wstring temps{};
if (obj.num < 0)
{
temp = -obj.num;
temps += supers[0xb];
}
if (std::abs (obj.num) > obj.den)
{
lldiv_t q = std::div ((long long) obj.num, (long long) obj.den);
temps = std::format (L"{0}", q.quot);
temp = ((T) (q.rem));
}
std::wstring temp_ = std::format (L"{}", temp);
for (auto t : temp_)
{
temps += supers[t - L'0'];
}
temps += L"/";
temp_ = std::format (L"{}", obj.den);
for (auto t : temp_)
{
temps += (L'\u2080' + t - L'0');
}
return std::format_to (ctx.out (), "L{0}", temps);
}
return std::format_to (ctx.out (), L"{0}/{1}", obj.num, obj.den);
}
};
Подробнее здесь: https://stackoverflow.com/questions/795 ... stdwstring
Попытка сделать пользовательский формат как Std :: String, так и Std :: Wstring ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Попытка сделать пользовательский формат как std :: string, так и std :: wstring [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-