c++ - C++ 中的模板特化和函数重载

标签 c++ templates c++11 polymorphism overloading

我正在尝试构建一个能够调用成员和非成员函数指针的静态包装函数。

我得出的结论如下-

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/

相关文章:

c++ - 程序忽略输入

c++ - 在 C++ 中显示所有基本类型的数据大小的程序

c++ - 如何通过命令行参数分隔botan加密和解密操作?

c++11 线程不修改相同的值

c++ - 堆栈展开期间未调用两个析构函数之一

c++ - 无符号类型按位移位的 RHS 操作数类型

c++ - 如何在 Qt C++ 中为数组动态分配内存?

c++ - 模板函数中 std::string 的类型推断失败

c++ - 从模板创建对象,类型由用户输入 c++

c++ - 在特化的情况下,检查的保护参数包是否会导致格式错误的程序?