utility:
utility库不是一个有同意主题的Boost库,而是包含了若干个很小但有用的工具
BOOST_BINARY:
BOOST_BINARY提供一组宏,用于实现简单的二进制常量表示.
BOOST_BINARY的定义位于<boost/utility/binary.hpp>中,也可以通过<boost/utility.hpp>间接包含。
#include <boost/utility/binary.hpp>
或者
#include <boost/utility.hpp>
它使用boost.preprocessor预处理元编程工具将一组或多组01数字在编译期展开成为一个八进制数字。每个数字组之间可以用空格分隔,每组可以容纳1个到8个0/1数字。
注意:数字组的长度一定不能超过八个,由于预处理宏展开的限制,嵌套层次太深会导致无法通过编译,报出一大堆错误。
示范:BOOST_BINARY用法的例子如下:
#include <iostream>
#include <bitset>
#include <assert.h>
#include <boost/utility.hpp>
using namespace boost;
using namespace std;
int main()
{
cout<<hex<<showbase;
cout<<BOOST_BINARY(0110)<<endl;
cout<<BOOST_BINARY(0110 1101)<<endl;
cout<<BOOST_BINARY(10110110 01)<<endl;
cout<<bitset<5>(BOOST_BINARY(0110))<<endl;
system("pause");
return 0;
}
除了最基本最通用的BOOST_BINARY宏外,本组件还包含形如BOOST_BINARY_XXX的宏,其中XXX是标准的整数后缀,如U(unsigned int),UL(unsigned long)等,用以支持需要特定整数类型的地方,例如:如果编译器支持long long(64位整数),则对应的宏是BOOST_BINARY_LL;
示范:
cout<<BOOST_BINARY_UL(101 1001)<<endl;
long long x = BOOST_BINARY_LL(1101);
cout<<x<<endl;
BOOST_BINARY宏提供了很好的初始化操作方法,在某些需要按位操作的情况下特别有用,比如使用std::bitset,而且BOOST_BINARY宏都是在编译期展开的,没有任何运行时开销.
BOOST_CURRENT_FUNCTION:
微软编译器(VC)在c89的__FILE__和__LINE__之外定义了一些扩展宏,其中的__FUNCTION__宏可以表示函数名称,GCC,intel C等编译器也定义有类似的宏,而C99标准则定义了__func__宏以实现同样的功能。但目前的c++98标准不能这样做。
BOOST_CURRENT_FUNCTION宏为c++补充了这个功能,而且功能更强大,更具可移植性。
用法:
#include <boost/current_function.hpp>
只需要在代码中使用BOOST_CURRENT_FUNCTION宏,就可获得包含该宏的外围函数名称,它表现了一个包含完整函数声明的编译期字符串,如果BOOST_CURRENT_FUNCTION宏不处于任何函数作用域之内,则行为依编译器而不同(在vc上会报出编译错误)。
示范:BOOST_CURRENT_FUNCTION宏的用法:
#include <iostream>
#include <bitset>
#include <assert.h>
#include <boost/current_function.hpp>
using namespace boost;
using namespace std;
double func(int i)
{
cout << BOOST_CURRENT_FUNCTION<<endl;
return 0.0;
}
//string str = BOOST_CURRENT_FUNCTION;/err
int main()
{
cout<<__FUNCTION__<<endl;
cout<<BOOST_CURRENT_FUNCTION<<endl;
func();
system("pause");
return 0;
}
实现原理:
BOOST_CURRENT_FUNCTION宏是针对各种编译器把编译器特定的宏定义为BOOST_CURRENT_FUNCTION,因此它的能力完全依赖于编译器.
例如对于VC:
#define BOOST_CURRENT_FUNCTION __FUNCSIG__
而GCC则是:
#define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__