我正在尝试构建一个能够调用成员和非成员函数指针的静态包装函数。
我得出的结论如下-
template <typename Derived>
struct CallAny {
template<typename F> using ReturnType = typename std::function<typename std::remove_pointer<F>::type>::result_type;
template<typename F, bool IsMember, typename... Args>
static ReturnType<F> function_wrapper(Derived* obj, F func, Args... args);
template<typename F, typename... Args>
static ReturnType<F> function_wrapper<F, true, Args...>(Derived *obj, F func, Args... args) {
return obj->*func(args...);
}
template<typename F, typename... Args>
static ReturnType<F> function_wrapper<F, false, Args...>(Derived *obj, F func, Args... args) {
return func(args...);
}
};
struct CallAnyDerived : public CallAny<CallAnyDerived> {};
此处 F
是一个函数指针类型,必须使用 Args...
中给出的参数调用。 F
可能是 C 风格的函数指针或继承自 CallAny
的类 Derived
的成员。
当我尝试编译这段代码时,我收到一条错误消息 -
XXXXXXXXXXX: error: function template partial specialization ‘fucntion_wrapper<F, true, Args ...>’ is not allowed
static ReturnType<F> function_wrapper<F, true, Args...>(Derived *obj, F func, Args... args) {
^
XXXXXXXXXXX: error: function template partial specialization ‘fucntion_wrapper<F, false, Args ...>’ is not allowed
static ReturnType<F> function_wrapper<F, false, Args...>(Derived *obj, F func, Args... args) {
^
我该如何解决这个问题?
最佳答案
一般来说,你不能部分特化一个函数。解决这个问题的方法是使用类似 static R call(...)
的东西创建一个辅助结构,并改为部分专门化辅助结构。
在这种情况下你根本不需要模板特化,你可以使用重载
template <typename Derived>
struct CallAny {
template<typename F> using ReturnType = typename std::function<typename std::remove_pointer<F>::type>::result_type;
// takes pointer to member function
template<typename R, typename... Ts, typename... Args>
static R function_wrapper(Derived* obj, R (Derived::*func)(Ts...), Args... args) {
return obj->*func(args...);
}
// takes everything else
template<typename F, typename... Args>
static ReturnType<F> function_wrapper(Derived *obj, F func, Args... args) {
return func(args...);
}
};
关于c++ - C++ 中的模板特化和函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079607/