我想编写一个模板函数,它可以获取任何类/结构的对象,并在线程中调用其任何成员函数。以下没有编译,我想它无法弄清楚: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) ;
}
答案 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
需要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)...));
}