2016-10-06 4 views
3

どのクラス/構造体のオブジェクトを取り、そのメンバ関数をスレッドで呼び出すことができるテンプレート関数を書いてみたいと思います。以下はコンパイルされません、私はそれが把握できないと思います:std::result_of< F(Args...) >::typestd :: asyncを使ってクラスメンバ関数を起動するテンプレート関数

提案、お手伝いしますか?

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) ; 
} 
+0

decltp​​eを使用し、関数の本体で関数のシグネチャを複製することができます。 – MikeMB

+0

あなたはresult_ofにTを渡すのを忘れていませんか? – MikeMB

答えて

4

あなたがC++ 14、ちょうどautoを使用する使用することができた場合:あなたは、あなたの中に引数を逃している

auto Async(F&& f, T&& t, Args&&... params) 
    -> std::future<decltype( 
     (t->*f) (std::forward<Args>(params)...))>    
     )> { // .. same as before 
2

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)...)); 
} 

をそうしないと、このようなものが必要result_of宣言。あなたの機能FTArgs...を取り、あなたが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)...)); 
} 
関連する問題