如何将tr1/array转换为std :: string?

wee*_*eeo 4 c++ string casting

我不知道怎么投std::tr1::array<unsigned char, 16>std::string

编译器总是抱怨,我试过了

std::tr1::array<unsigned char, 16> sss;
string(sss);
string asd(sss);
Run Code Online (Sandbox Code Playgroud)

要么工作......

Yak*_*ont 5

unsigned char使这个棘手.如果你知道你的系统使用二进制补码1个字节8位unsigned charchar,和隐式转换unsigned charchar你想要做什么(这并不总是如此!),你的阵列缓冲区空终止(即字符后的第0一个应该是废弃),这个功能有效:

template<std::size_t N>
std::string to_string( std::array<unsigned char, N> const& arr ) {
  std::string retval;
  for( auto c : arr ) {
    if (!c)
      return retval;
    retval.push_back(c);
  }
  return retval;
}
Run Code Online (Sandbox Code Playgroud)

我包含了一些关于数组可能"满"并且缺少空终止符的可能性的偏执狂.

如果你真的想要所有16个unsigned char,即使有些是null,你也会想要使用它:

std::string str( arr.begin(), arr.end() );
Run Code Online (Sandbox Code Playgroud)

应该使用隐式转换unsigned charchar.

如果隐式转换没有做你想要的,并且你知道它array的内存实际上是一个数组,char即使它的类型是unsigned char,你需要做一些重新解释.

对于null终止的情况:

template<std::size_t N>
std::string to_string_helper( const char* buf ) {
  std::string retval; 
  if (!buf)
    return retval;
  for ( const char* it = buf; it < (buf+N); ++it ) {
    if (!*it)
      return retval;
    retval.push_back(*it);
  }
  return retval;
}
template<std::size_t N>
std::string to_string_2( std::array<unsigned char, N> const& arr ) {
  return to_string_helper<N>( arr.data() );
}
Run Code Online (Sandbox Code Playgroud)

而对于"整个缓冲区"的情况:

template<std::size_t N>
std::string to_string_2( std::array<unsigned char, N> const& arr ) {
  const char* str = reinterpret_cast<const char*>(arr.data());
  return std::string( str, str+N );
}
Run Code Online (Sandbox Code Playgroud)