std::function的使用
我们知道在C++,可调用的实体主要包括 函数、函数指针、可以隐式转换为函数指针的对象、或者实现了 operator()的对象(即C++98中的functor)。在C++0x中,新增加了一个 std::function 对象是对C++中现有的可
调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。
template <class T> function; // undefined
template <class Ret, class... Args> class function<Ret(Args...)>;
我们来看几个关于function对象的例子:
#include < functional>
std::function< size_t (const char*) > print_func;
/// normal function -> std::function object
size_t CPrint(const char*) { ... }
print_func = CPrint;
print_func("hello world"):
/// functor -> std::function object
class CxxPrint
{
public:
size_t operator()(const char*) { ... }
};
CxxPrint p;
print_func = p;
print_func("hello world");
这个例子中,我们先后把一个普通的函数和一个功能器类对象(functor)赋值给了一个std::function对象, 然后我们通过该对象来调用。其它的C++中的可调用实体都可以像上面一样来使用。通过std::function的包裹,我们可以像传递普通的对象一样来传递可调用实体,这样就很好解决了类型安全的问题。了解std::function的基本用法后,下面我们来看一下使用过程中的注意事项:
关于可调用实体转换为std::function对象需要遵守以下两条原则:
(1) std::function对象的参数能转换为可调用实体的参数。
可调用实体的返回值能转换为std::function对象的(这里注意,所有的可调用实体的返回值都与返回void的
std::function对象的返回值兼容)。
(2) std::function对象可以refer to满足(1)中条件的任意可调用实体。
(3) std::function object最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等。