我对以下代码段有疑问,不确定我是否正确理解代码。
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...);
};
<R(*)(Args...)>
是&#34;类型的函数指针&#34;并且R和(*)之间的闪烁空间不一定是必需的?
什么可以实现RunnableAdapter的实例化?
我认为它就像下面一样
void myFunction(int i){ // };
RunnableAdfapter<(void)(*)(int)> ra(MyFunction);
ra.Run(1); //which calls MyFunction(1)
答案 0 :(得分:1)
首先,您提供的代码存在一些错误,甚至无法编译。回答一些问题:
你可以宣布你这样的课
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)...);
}