Попытка сделать пользовательский формат как Std :: String, так и Std :: WstringC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Попытка сделать пользовательский формат как Std :: String, так и Std :: Wstring

Сообщение Anonymous »

Я использую 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Попытка сделать пользовательский формат как std :: string, так и std :: wstring [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • `std::map<std::string, enum{1, 2, 3, 4}>` (или std::map<std::string, tuple<bool, bool>>`) кэширует` против `std: :set<st
    Anonymous » » в форуме C++
    0 Ответы
    323 Просмотры
    Последнее сообщение Anonymous
  • Назначьте ввод Map> выходу Map>
    Anonymous » » в форуме JAVA
    0 Ответы
    124 Просмотры
    Последнее сообщение Anonymous
  • Конвертировать Map > для списка > используя API потока
    Anonymous » » в форуме JAVA
    0 Ответы
    97 Просмотры
    Последнее сообщение Anonymous
  • Непонятное поведение std::next_permutation с std::wstring
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»