使用std::async启动类成员函数的模板函数
template function to launch a class member function with std::async
我想写一个模板函数,它可以接受任何类/结构的对象,并在线程中调用其任何成员函数。以下不编译,我猜它不能算出来:std::result_of< F(Args...) >::type
.
有什么建议吗?
class test_f {
public:
int f(int m) {
std::cout << " call f : " << m << std::endl;
return 1;
}
};
template<typename F, typename T, typename... Args>
std::future<typename std::result_of<F(Args...)>::type>
Async(F&& f, T&& t, Args&&... params) {
return(std::async(std::launch::async, std::forward<F>(f),
std::forward<T>(t), std::forward<Args>(params)...));
}
int main() {
test_f tf ;
auto a = Async(&test_f::f, &tf, 1) ;
}
如果你可以使用c++ 14,就使用auto
:
template<typename F, typename T, typename... Args>
auto Async(F&& f, T&& t, Args&&... params) {
return(std::async(std::launch::async, std::forward<F>(f),
std::forward<T>(t), std::forward<Args>(params)...));
}
否则你需要这样做:
auto Async(F&& f, T&& t, Args&&... params)
-> std::future<decltype(
(t->*f) (std::forward<Args>(params)...) )>
)> { // .. same as before
你只是错过了一个参数在你的result_of
声明。您的函数F
需要T
和Args...
,您忘记了T
:
template<typename F, typename T, typename... Args>
std::future<typename std::result_of<F(T, Args...)>::type>
// ^^^^
Async(F&& f, T&& t, Args&&... params) {
return(std::async(std::launch::async, std::forward<F>(f),
std::forward<T>(t), std::forward<Args>(params)...));
}
或者,T
是完全不必要的,因为您任意地将自己限制为1+参数函数。而且很容易被遗忘。所以你可以删掉它:
template<typename F, typename... Args>
std::future<typename std::result_of<F(Args...)>::type>
Async(F&& f, Args&&... params) {
return(std::async(std::launch::async, std::forward<F>(f),
std::forward<Args>(params)...));
}
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针