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

来源:互联网 发布:北大青鸟云计算 编辑:程序博客网 时间:2024/05/16 19:28

    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> >();}
    0 0