c++ - 使用 std::async 启动类成员函数的模板函数

标签 c++ c++11

我想写一个模板函数,它可以接受任何类/结构的对象并在线程中调用它的任何成员函数。以下不编译,估计是想不通: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

关于c++ - 使用 std::async 启动类成员函数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893594/

相关文章:

c++ - 如何让 C++ Boost 线程休眠

c++ - 如何静态检查可变参数模板参数列表中是否存在类型 T

c++ - C 风格使用现代 C++ 类

c++ - 为什么有人需要指向指针的指针?

c++ - 我可以将对象分配给整型变量吗?

c++ - 链接 C++ 库时 undefined reference

c++ - 如何将字符串数组作为 BSTR* 传递给 Web 服务代理

c++ - 是否存在与 `std::move`相反的强制转换(或标准函数)

c++ - atomic<T*> 总是无锁的吗?

c++ - 来自 http://www.cplusplus.com 的 std::packaged_task::reset 示例不起作用