std::function bound to member function

99封情书 提交于 2019-12-05 08:05:27
Luc Danton

Yes, it should work. One of the requirements on the functor argument for any of the appropriate constructor (e.g. template<class F> function(F f);) of std::function<R(ArgsTypes...)> is:

f shall be Callable (20.8.11.2) for argument types ArgTypes and return type R.

(20.8.11.2.1 functionconstruct/copy/destroy [func.wrap.func.con])

In turn, "Callable for argument types ArgTypes and return type R" is a Standard quasi-concept (for lack of concepts) defined in terms of the pseudo-expression INVOKE(f, declval<ArgTypes>()..., R). This pseudo-expression unifies regular functors, which are invoked with the usual call syntax (e.g. f(a, b, c)), with pointers to members which have their own quirks (e.g. p->*a or (r.*a)(b, c)). INVOKE is defined in 20.8.2 Requirements [func.require].

Furthermore, the effects of using the call operator of std::function include INVOKE(f, std::forward<ArgTypes>(args)..., R) (20.8.11.2.4 function invocation [func.wrap.func.inv]), meaning that the 'right' thing is done for pointers to members.

There are in fact a lot of other things that are also defined in terms of Callable/INVOKE in the Standard, like std::bind, std::thread, std::reference_wrapper and std::result_of*.

*: in particular this means that something like

template<typename Functor>
typename std::result_of<Functor()>::type apply(Functor functor)
{ return std::forward<Functor>(functor)(); }

is problematic at least for that reason.

The following syntax works and is shorter at least:

std::function<int (Zot*)> fn = std::mem_fn(&Zot::A);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!