我需要将一些预定义的参数和一些用户传递的参数转发给成员函数.
#define FWD(xs) ::std::forward<decltype(xs)>(xs)
template<class T, class... Ts, class... TArgs>
void forwarder(void(T::*fptr)(Ts...), TArgs&&... xs)
{
T instance;
(instance.*fptr)(FWD(xs)..., 0);
// ^
// example predefined argument
}
forwarder(&example::f0, 10, 'a');
forwarder(&example::f1, 10, "hello", 5);
Run Code Online (Sandbox Code Playgroud)
这适用于非模板成员函数.
forwarder但是,传递给can 的成员函数指针也指向模板函数.不幸的是,T在这种情况下,编译器无法推断出类型:
struct example
{
void f0(int, int) { }
template<class T>
void f1(T&&, int) { }
};
// Compiles
forwarder(&example::f0, 10);
// Does not compile
forwarder(&example::f1, 10);
Run Code Online (Sandbox Code Playgroud)
错误:
prog.cpp:30:28: error: no matching function for call to 'forwarder(<unresolved overloaded function type>, int)' …Run Code Online (Sandbox Code Playgroud)