【发布时间】:2013-01-05 19:57:30
【问题描述】:
我希望接受一个模板化的成员函数作为模板参数。
例如,给定这个类:
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...);
}
我知道为什么这可能是不可能的,但如果这是真的,你能指出为什么的标准吗?我也在尝试更多地了解该标准的细节。
【问题讨论】:
-
试试
Invoke<&A::Foo<int, bool>>(5, true)。如果可行,请编写一个类型推断包装器 function 模板。 -
@KerrekSB 但我不知道如何在函数类型中指定 Invoke 应该接受具有此签名的函数(不对其进行硬编码),因为您在指定时似乎必须指定参数成员函数指针类型。
-
好吧,你可以让
Invoke成为一个更强大的模板... -
@KerrekSB 这就是问题所在。
标签: c++ templates c++11 variadic-templates