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> >();
    }
    
    • 8
      点赞
    • 18
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    五道口纳什

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值