Преобразовать строку в __uint128_t, используя поток строк

Я пытаюсь извлечь различные типы данных из строки.

void                    readHeader(char buf[BUFFSIZE])
{
  std::istringstream    hdr(buf);
  __uint128_t           id_client;

  hdr >> id_client; // doesn't compile
}

Я получаю эту ошибку, когда я делаю это hdr >> id_client:

Unix/UnixSocket.cpp:158:10: error: ambiguous overload for ‘operator>>’ in ‘hdr >> id_client’ Unix/UnixSocket.cpp:158:10: note: candidates are: In file included from /usr/include/c++/4.7/sstream:39:0,
                 from Unix/UnixSocket.cpp:11: /usr/include/c++/4.7/istream:118:7: note: std::basic_istream<_CharT,
_Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT,
_Traits>::__istream_type = std::basic_istream<char>] <near match> /usr/include/c++/4.7/istream:118:7: note:   no known conversion for argument 1 from ‘__int128 unsigned’ to ‘std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}’ /usr/include/c++/4.7/istream:122:7: note: std::basic_istream<_CharT,
_Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT,
_Traits>::__istream_type = std::basic_istream<char>; std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] <near match> /usr/include/c++/4.7/istream:122:7:

Есть ли способ правильно хранить мои id_client в этом __uint128_t переменная?

1 ответ

https://gmplib.org/ может помочь. Класс mpz_class абстракции объекта gmpxx поддерживает операторы ввода-вывода, а функция mpz_export(...) позволяет преобразовать результат в массив байтов. Если они превышают 16 байт, вы можете выбросить исключение или пожаловаться в противном случае. Не очень быстро, но я думаю, быстро реализовать.

Другие вопросы по тегам