std::function
中提取和简化的
#include <functional>
#include <iostream>
struct Foo
{
int num_;
};
int main()
{
const Foo foo(314159);
// store a call to a data member accessor
std::function<int(Foo const&)> f_num = &Foo::num_;
std::cout << "num_: " << f_num(foo) << '\n';
}
为什么这个
std::function
接受指向数据成员的指针,为什么 f_num(foo)
完全有效?
我检查过它使用了这个构造函数:
#if _USE_FUNCTION_INT_0_SFINAE
template <class _Fx, typename _Mybase::template _Enable_if_callable_t<_Fx&, function> = 0>
#else // ^^^ _USE_FUNCTION_INT_0_SFINAE // !_USE_FUNCTION_INT_0_SFINAE vvv
template <class _Fx, class = typename _Mybase::template _Enable_if_callable_t<_Fx&, function>>
#endif // _USE_FUNCTION_INT_0_SFINAE
function(_Fx _Func) {
this->_Reset(_STD move(_Func));
}
std::function
构造函数接受指向数据成员的指针,因为它是Callable。这之所以有效,是因为引擎盖下有 std::invoke
。
发生的事情是这样的:
std::function
构造函数获取指向数据成员的指针。f_num(foo)
时,它使用 std::invoke
,它知道如何处理指向数据成员的指针。在这种情况下,它将指针视为一个函数,该函数接受一个对象并返回引用的数据成员。以这种方式使用成员指针符合 C++ 标准,并允许在代码中使用一些强大的模式。