【发布时间】:2018-03-24 12:12:52
【问题描述】:
为什么以下代码在 gcc 或 clang 下都无法编译:
class Foo {
public:
void bar(int) {}
};
template< class T, typename ...Args, void(T::*Member)(Args...) >
void member_dispatch(Args&&... args, void* userdata)
{
T* obj = static_cast<T*>(userdata);
(obj->*Member)(std::forward<Args>(args)...);
}
int main()
{
Foo foo;
member_dispatch<Foo, int, &Foo::bar>(1, &foo);
return 0;
}
参见例如here.
这个问题可能会与this 合并,尽管在这里我从 gcc 和 clang(而不是 VS)得到不清楚的编译错误。
【问题讨论】:
-
为什么不能简单地用标准的
std::function和std::bind(或lambdas)解决你的问题?或者像几乎所有需要可调用对象的标准库函数和类一样,通过对函数类型使用单个typename模板参数? -
这是为了与使用
void callback(<some params>, void* userdata)形式的回调的C库交互
标签: c++ c++11 templates variadic-templates member-function-pointers