假设我有这样X
声明和定义的结构:
struct X {
int i;
X(int i = 0) : i(i) { std::cout << "X(int i = " << i << "): X[" << this << "]" << std::endl; }
int multiply(int a, int b = 1) { return i * a * b; }
};
我想X::multiply
通过函数指针调用。为此,我定义了一个proxy
-function:
template <typename ObjectType,
typename ReturnType,
typename... ParameterTypes>
ReturnType proxy(ObjectType * object,
ReturnType (ObjectType::* func)(ParameterTypes...),
ParameterTypes... params) {
return (object->*func)(params...);
}
我这样使用它:
int main() {
X x(10);
int a = 5;
int r = proxy<X, int, int, int>(&x, &X::multiply, a, 2); // proxy<...> works
//int r = proxy(&x, &X::multiply, a, 2); // proxy works
//int r = proxy2<X, int, int, int, int>(&x, &X::multiply, a, 2); // proxy2<...> does not work
//int r = proxy2(&x, &X::multiply, a, 2); // proxy2 works
std::cout << "Proxy-Test:"
<< "\na = " << 5
<< "\nr = " << r
<< std::endl;
}
proxy<...>
甚至proxy
像魅力一样工作,除了我不能proxy
只用一个参数调用,尽管第二个参数应该是可选的。(在 's 的调用中省略右值参数 2proxy
会产生错误。)当然,proxy
期望正好有两个参数,所以我还创建了另一个版本的proxy
-function:
template <typename ObjectType,
typename ReturnType,
typename... ParameterTypes,
typename... ArgumentTypes>
ReturnType proxy4(ObjectType * object,
ReturnType (ObjectType::* func)(ParameterTypes...),
ArgumentTypes... args) {
return (object->*func)(args...);
}
此版本的参数和参数类型分为单独的参数包。奇怪的是,调用proxy2<X, int, int, int, int>(&x, &X::multiply, a, 2);
使编译器认为此调用的 ParameterTypes 是 (int, int, int) 而 ArgumentTypes 是 (int, int)。同样奇怪的是调用proxy2(&x, &X::multiply, a, 2);
工作得很好。如果我遗漏了正确的值 2,这些都不起作用。
问题仍然存在:如何X::multiply
只使用 a 参数而不指定 b 来调用?