起初您提供的代码有一些错误,甚至无法编译。要回答你的问题:
- 空格不是必需的。
- 见下面的例子
你可以像这样声明你的班级
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)...);
}