C++基础——bitset与string的相互转化

bitset类模板提供了非常直接的接口进行与string类型数据的转换。然而一些需要注意的细节又是非常繁琐。具体如何繁琐,且看下文分解。

在阅读本文之前,你需要知道bitset模板类实现的基础,即非类型模板参数技术。

bitset<>类模板的非类型参数的实例化,构造时可以接受一个string类型,且bitset<>::to_string成员函数可以实现向string型的转换。但需注意的一点是,string为参数的构造以及to_string都是成员模板,因为库类std::basic_string本身也是一个模板,一般的string类形式,std::stringbasic_string<char>的别称:

typedef basic_string<char, char_traits<char>, allocator<char> >
    string;

因为string类型参数的构造以及to_string都是以成员模板的形式定义的,所以(新的c++标准放宽了这些条件,但为了严格,以及阅读稍早期一点代码的方便,还是整理出来):

// 推挤写法
std::bitset<6>(std::string("110101"));
// 而不是
std::bitset<6>("110101");

第二种版本可能会发生编译错误在一些老式的编译器上,因为编译器不知道如何进行实例化。同样地,因为成员模板函数的特性,不可以直接这样写:

string s = b.to_string();

你必须写成这样一个丑八怪:

string s = 
    b.template to_string<char, char_traits<char>,
         allocator<char> >();

b.template的存在是为了告诉编译器,其后的第一个<不是小于号,而是模板参数列表的格式。

实践中为了代码的可阅读性,可构造如下的辅助函数:

  • 针对string类型参数的构造
template<size_t N>
bitset<N> from_string(const string& s)
{
    return bitset<N>(s);
}

这时客户端程序:

bitset<6> b = from_string<6>("110101");

这里隐式地存在一个const string& s = "110101";的转换。

  • 针对b.to_string这一模板成员变量:
    我们可以继续封装:
template<size_t N>
std::string to_string(const std::bitset<N>& b)
{
    return b.template
        to_string<char, char_traits<char>, allocator<char> >();
}

你可能感兴趣的:(C++,bitset,成员模板,to-string)