CTTCG 11 Generic Libraries
Callables
Callable 有很多:函数、函数指针、成员函数、lambda 表达式(函数对象特例)、函数对象(Functor)等。
lambda 表达式
lambda 是函数对象。当捕获列表没有参数的时候,lambda 还有一个转换成一般函数指针的隐式转换操作符。在无捕获列表的 lambda 前加上 +
符号,能使得 lambda 变成函数指针也就是这个道理。
std::invoke
支持 Callable 并不简单,因为需要考虑到成员函数的调用需要通过 this 指针来完成。C++17 提供了 std::invoke
来将这些操作统一起来,只需要把 this 指针当作第一个参数传入。
Surrogate Function - 从类型隐式转换得来
Dummy/Surrogate function(哑函数/替代函数)指的是某一个函数对象还具有一个到普通函数引用或者普通函数指针的隐式转换,这个转换好的函数就是替代函数。替代函数用到了一次隐式转换,所以在参数匹配均不优于函数对象的其他()
操作符重载时不会被选中。但若替代函数是更好的替代,将出现函数使用 ambiguous 的情况。
class IndirectFunctor {
public:
void operator()(double, double) const {}
operator auto () const {
return +[](double, int) {};
};
};
void activate(IndirectFunctor const& funcObj) {
funcObj(3, 5); // ERROR: ambiguous
}