2014-11-02 139 views
3

我试图从字符串中提取不同类型的数据。使用字符串流将字符串转换为__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变量?

+2

由于类型不是标准类型,因此标准库不支持它。你必须手动解析和转换数字。 – 2014-11-02 15:03:34

+0

如果编译器支持它,也许你可以使用'uint128_t'。 – justanothercoder 2014-11-02 15:05:04

+0

@JoachimPileborg我很确定他正在寻找来自clang/gcc团队的标准库的补充,因为他们已经将类型添加到他们的编译器中。如果能找到它,这是一个有趣的问题。 – 2015-01-22 09:51:28

回答

1

https://gmplib.org/可能会有所帮助。 gmpxx对象抽象的mpz_class类支持I/O操作符,mpz_export(...)函数允许将结果转换为字节数组。如果它们超过16个字节,则可能会抛出异常或以其他方式投诉。虽然速度不是很快,但我认为实施起来很快。