tow*_*ism 0 c++ templates typedef member-function-pointers
template<typename C, typename Arg>
int foo(C* c, int (C::*func)(Arg), Arg a)
{
c->*func(a);
}
Run Code Online (Sandbox Code Playgroud)
要调用'foo',我们必须同时使用A*和&A :: bar,
foo(A*,&A::bar,var);
Run Code Online (Sandbox Code Playgroud)
有没有办法定义模板(例如作为结构),这样就不需要传递"A*"了?如何定义从"&A :: bar"获取A*的模板?
如果要在该实例上调用非静态方法,则无法避免传递实例,除非您不介意在临时的,默认构造的实例上调用它:
template<typename C, typename Arg>
int call_on_temp(int (C::*func)(Arg), Arg a)
{
C temp;
temp.*func(a);
}
Run Code Online (Sandbox Code Playgroud)
或者调用者将实例显式绑定到仿函数:
template<typename F, typename Arg>
int call_on_functor(F func, Arg a)
{
func(a);
}
Run Code Online (Sandbox Code Playgroud)
这使得呼叫网站变得丑陋:
call_on_functor(std::bind(std::mem_fn(&Class::method), instance), arg);
Run Code Online (Sandbox Code Playgroud)
(你仍然需要实例,你只是将它从一个地方移动到另一个地方).
请注意,您可以从函数指针推断出A 的类型,您无法推断出一个实例来调用您的函数.如果要调用静态方法,则根本不需要类类型:
template<typename Arg>
int call_on_static(int (*func)(Arg), Arg a)
{
func(a);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |