c ++ 11 std :: async不能通过引用使用可变参数模板参数

时间:2016-11-20 18:55:35

标签: c++ c++11

这段代码怎么可能不起作用? 我希望MyThread :: run能够使用任何类型的参数,参数通过引用传递,而不是通过值传递。

http://ideone.com/DUJu5M

#include <iostream>
#include <future>
#include <string>

class MyThread {

        std::future<void> future;

    public:

        template<class... Args>
        MyThread(Args&&... myArgs) :
        future(std::async(std::launch::async, &MyThread::run<Args&&...>, this, std::forward<Args>(myArgs)...))
        {}

        template<class... Args>
        void run(Args&&... myArgs) {}
};

int main() {
    std::string x;
    MyThread thread(x); // Not working
    MyThread thread(10); // Working
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您可以使用std::ref传递reference_wrapper。它将通过std::bind / std::threadstd::async等标准库功能自动解压缩。

int main() {
    std::string x;
    MyThread thread(std::ref(x)); // Not working
    MyThread thread2(10); // Working
    return 0;
}

demo