4.2 Boost 库工具类 ignore_unused 的使用
编写代码的过程中有时会出现一些暂时用不到但又必须保留的变量,GCC 等编译器会对此发出警告,使用"-Wunused"可以关闭这些警告消息,不过这也有可能导致潜在的隐患。古老的办法是使用"(void)var"的形式来"使用"一下变量,但这种方法含义不明确,不利于维护。
Boost 程序库的 ignore_unused 组件就这个问题给出了更好的解决方案。它原本是 proto 库里的一个小工具,因为在很多其他组件中被使用,所以在增强了功能后被"扶正"。
ignore_unused 位于名字空间 boost,需要包含的头文件如下:
#include <boost/core/ignore_unused.hpp>
using namespace boost;ignore_unused 的实现非常简单,它几乎什么也没有做:
template <typename... Ts>
inline void ignore_unused(Ts const& ...) {}ignore_unused 使用可变参数模板,支持任意数量、任意类型的变量,把它们作为函数的参数"使用"了一下,从而"骗"过编译器,达到与"(void)var"完全相同的效果。但它的命名更清晰,写法也更简单,而且由于使用的是 inline 函数,所以运行时完全没有效率损失。
假设我们有如下的一个函数,出于某种原因,它没有使用参数 x,并且声明了一个暂未使用的变量 i:
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;int func(int x, int y)
{int i; //未使用的变量 ireturn y; //未使用参数 x 的函数
}int main()
{cout << "Start" << endl;func(10, 12);cout << "End" << endl;system("pause");return 0;
}使用 ignore_unused 我们可以显式地忽略这些变量,从而轻易地消除这些警告信息:
#include <iostream>
#include <string>
#include <Windows.h>
#include <boost/core/ignore_unused.hpp>using namespace std;int func(int x, int y)
{int i; //未使用的变量 iboost::ignore_unused(x, i);return y; //未使用参数 x 的函数
}int main()
{cout << "Start" << endl;func(10, 12);cout << "End" << endl;system("pause");return 0;
}显然,ignore_unused 比 C 风格的 "(void)var" 要更容易理解,无须多余的注释,代码自身说明了一切。
ignore_unused 库还可以作用于未使用的局部类型定义,它的另一种形式如下:
template <typename... Ts>
inline void ignore_unused() { //注意没有函数参数列表ignore_unused 库的模板用法与函数的用法类似,但它不需要函数参数,而是在模板参数列表里写出要忽略的类型。
例如,下面的函数内部定义了一个 typedef,然后用 ignore_unused 忽略它:
void func2()
{typedef int result_type; //暂未使用的类型定义ignore_unused<result_type>();
}