【发布时间】:2021-02-18 19:14:36
【问题描述】:
我愿意支持这样的电话
class BaseClass {
public:
virtual void print2(float arg1, float arg2) = 0;
};
int main() {
invoke(subclass, &BaseClass::print2, 1, 2);
}
在哪里
-
subclass自动向上转换为BaseClass - 参数自动从
int转换为float - 使用错误参数类型/类类型的调用会导致错误
我设法用基类解决了这部分问题。 但是争论的部分让我很头疼。 我的方法是从传递的函数指针中提取所有需要的类型信息。 然后(如果可能)隐式转换其他参数。
到目前为止,我所拥有的是:
template<class Func> struct FunctionPointer2 {};
template<class Class, typename Arg1, typename Arg2> struct FunctionPointer2<void (Class::*)(Arg1, Arg2)> {
typedef Class Class;
typedef Arg1 Argument1;
typedef Arg2 Argument2;
};
template <typename Func>
void invoke2(typename FunctionPointer2<Func>::Class* obj, Func func, typename FunctionPointer2<Func>::Argument1 arg1, typename FunctionPointer2<Func>::Argument2 arg2) {
(obj->*func)(arg1, arg2);
}
它可以工作,但是对于每个参数计数,需要另一个函数,函数指针结构,...。
所以问题来了:追随甚至可能吗?我怎样才能使它成为可能?
template<class Func> struct FunctionPointer {};
template<class Class, typename ... Args> struct FunctionPointer<void (Class::*)(Args ...)> {
typedef Class Class;
typedef Args Arguments; // pass type parameter pack here
};
template <typename Func>
void invoke(typename FunctionPointer<Func>::Class* obj, Func func, typename FunctionPointer<Func>::Arguments ... params) {
(obj->*func)(params ...);
}
感谢您的帮助:)
【问题讨论】:
-
不幸的是,我不能。我已经将我的问题简化为这个,但背景要复杂得多。具体来说,我需要它用于 Qt 中的异步、跨线程函数调用。
-
在您回复之前删除了我的评论。我相信你不应该需要提取参数类型,看看答案。
标签: c++ templates variadic-templates