2

我对下面的代码片段有疑问,不确定我是否正确理解了这些代码。

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...)>是“函数指针的类型”,R 和 (*) 之间的闪烁空间不是必需的吗?

  2. RunnableAdapter 的实例可能是什么?我假设它如下所示。
    void myFunction(int i){ // }; RunnableAdfapter<(void)(*)(int)> ra(MyFunction); ra.Run(1); //which calls MyFunction(1)

4

1 回答 1

1

起初您提供的代码有一些错误,甚至无法编译。要回答你的问题:

  1. 空格不是必需的。
  2. 见下面的例子

你可以像这样声明你的班级

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)...);
}
于 2015-08-12T04:34:58.577 回答