【问题标题】:template function to launch a class member function with std::async使用 std::async 启动类成员函数的模板函数
【发布时间】:2016-10-06 20:02:36
【问题描述】:

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

【问题讨论】:

  • 如果你可以使用 decltp​​e 并在函数签名中复制函数体。
  • 你没有忘记将 T 传递给 result_of 吗?

标签: c++ c++11


【解决方案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

【讨论】:

    【解决方案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)...));
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2014-01-09
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多