C ++函数指针作为Template参数

时间:2015-08-12 01:23:26

标签: c++ templates function-signature

我对以下代码段有疑问,不确定我是否正确理解代码。

template <typename R, typename... Args>                                     
class RunnableAdapter<R(*)(Args...)> {
 public:
  typedef R (RunType)(Args...);

  explicit RunnableAdapter(R(*function)(Args...))   
      : function_(function) {
  }

  R Run(Arg... args) {
    return function_(args...);
  }

 private:
  R (*function_)(Args...);
};
  1. <R(*)(Args...)>是&#34;类型的函数指针&#34;并且R和(*)之间的闪烁空间不一定是必需的?

  2. 什么可以实现RunnableAdapter的实例化? 我认为它就像下面一样 void myFunction(int i){ // }; RunnableAdfapter<(void)(*)(int)> ra(MyFunction); ra.Run(1); //which calls MyFunction(1)

1 个答案:

答案 0 :(得分:1)

首先,您提供的代码存在一些错误,甚至无法编译。回答一些问题:

  1. 不需要空格。
  2. 见下面的例子
  3. 你可以宣布你这样的课

    template <typename T>
    class RunnableAdapter;
    
    template <typename R, typename... Args>                                     
    class RunnableAdapter<R(*)(Args...)> { ... }
    

    并实例化

    RunnableAdapter<void(*)(int)> ra(&myFunction);
    

    但你可以简化它(这是完整的工作示例)

    #include <iostream>
    #include <string>
    
    template <typename T>
    class RunnableAdapter;
    
    template <typename R, typename... Args>                                     
    class RunnableAdapter<R (Args...)> {
    public:
    
      explicit RunnableAdapter(R(*function)(Args...))   
          : function_(function) {
      }
    
      R Run(Args... args) {
        return function_(args...);
      }
    
    private:
      R (*function_)(Args...);
    };
    
    void myFunction(int i){ std::cout << i << std::endl; }
    
    int main()
    {
        RunnableAdapter<void(int)> ra(&myFunction);
        ra.Run(1);
    }
    

    这将允许使用类似签名的表达式void(int)进行实例化。 它看起来更好,不需要(*)

    另外,另一种方法是在没有类专业化的情况下这样做,就像这样。 结果是一样的,但类声明和实例化略有不同。

    #include <iostream>
    #include <string>
    
    template <typename R, typename... Args>                                     
    class RunnableAdapter {
    public:
    
      explicit RunnableAdapter(R(*function)(Args...))   
          : function_(function) {
      }
    
      R Run(Args... args) {
        return function_(args...);
      }
    
    private:
      R (*function_)(Args...);
    };
    
    void myFunction(int i){ std::cout << i << std::endl; }
    
    int main()
    {
        RunnableAdapter<void, int> ra(&myFunction);
        ra.Run(1);
    }
    

    修改

    正如@ Jarod42建议的那样,最好像这样Run

    template<typename... Ts>
    R Run(Ts&&... args) {
      return function_(std::forward<Ts...>(args)...);
    }