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

时间:2016-10-06 10:28:03

标签: 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) ;
}

2 个答案:

答案 0 :(得分:4)

如果您可以使用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

答案 1 :(得分:2)

您在result_of声明中错过了一个参数。您的功能F需要TArgs...,而您忘记了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)...));
}