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::string
是basic_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
- C++基础——bitset与string的相互转化
- double与string的相互转化(C++)
- double与string的相互转化(C++)
- double与string的相互转化(C++)
- C/C++ --- double与string的相互转化
- string 与 byte[] 的相互转化
- list与String数组的相互转化
- Json 与 string 的相互转化
- string与unsigned char*的相互转化
- String与Integer的相互转化
- List与String[]的相互转化
- List与String[]的相互转化
- Date与String的相互转化
- String数组与List的相互转化
- java-String与Integer的相互转化
- String与Integer的相互转化
- CString与string相互转化
- time_t与string相互转化
- 递归算法2
- Synchronized和java.util.concurrent.locks.Lock的区别详解
- 项目规划
- XMPP框架 微信项目开发之XMPP简介——XMPP的起源,工作原理,使用方法
- 图的邻接表建立思想
- C++基础——bitset与string的相互转化
- MySql之按周,按月,按日分组统计数据
- GIS相关的博客
- Stem-and-Leaf Plot in R
- nyoj904 search
- 接手项目准备
- 小议linux中的软链接------顺便谈谈为什么编译有时会出现cannot find -lssl, cannot find -lcrypto
- mysql之分组 取前二
- Elasticsearch 基本操作