[英]Templated member function pointer as template parameter
我希望接受模板化成员函数作为模板参数。
例如,给定这个类:
class A
{
public:
template<typename... Args>
void Foo(Args...) {}
void Bar() {}
};
我希望能够调用:
Invoke<&A::Foo>(5, true);
这类似于调用:
A a;
a.Foo(5, true);
我知道如何为Bar()
做到这一点:
template<void (A::*F)()>
void Invoke()
{
A a;
(a.*F)();
}
int main()
{
Invoke<&A::Bar>();
}
是否可以将其扩展到模板化成员函数指针? 或者类似地,编写这样的转发函数,可以处理具有任何参数类型的函数。 这不起作用,但类似于:
template<typename... Args, void (A::*F)(Args...)>
void Invoke(Args... args)
{
A a;
(a.*F)(args...);
}
我可以理解为什么这可能是不可能的,但如果这是真的,你能指出为什么的标准吗? 我也在尝试更多地了解标准的细节。
是否可以将其扩展到模板化成员函数指针?
不。虽然如果您只需要Foo
的特定实例化,您可以使用Invoke<&A::Foo<int, bool>>
。
或者类似地,编写这样的转发函数,可以处理具有任何参数类型的函数。
为了能够使用不同的签名,您必须修改Invoke
以对任何类型的可调用对象进行操作。 然后,您必须定义一个调用实际函数的可调用对象:
struct callable_foo
{
explicit callable_foo( A& obj ) : _obj( obj ){}
template< typename ...Args >
void operator ()( Args&&... args )
{
_obj.Foo( std::forward< Args >( args )... );
}
A& _obj;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.