使用std :: async调用模板化成员函数

时间:2015-01-16 16:04:46

标签: c++ templates c++11

是否有可能以及如何使用std :: async调用类的模板化成员函数(最好不使用std :: bind)?请解释一下C ++ 11或C ++ 14标准是否允许这样的调用以及如何使它在MSVS2013中特别有效。

#include <future>

template<typename T> void non_member_template(T val) {}

struct X
{
    void member_non_template(int val) {}
    template<typename T> void member_template(T val) {}
    void call()
    {
        int val = 123;
        std::async(std::launch::async, &non_member_template<int>, val); // ok
        std::async(std::launch::async, &X::member_non_template, this, val); // ok
        std::async(std::launch::async, &X::member_template<int>, this, val); // error
    }
};

int main()
{
    X x;
    x.call();
}

2 个答案:

答案 0 :(得分:0)

我以前从未见过代码破坏编译器,但是你去了:

error MSB6006: "CL.exe" exited with code 1

我在上面的评论中建议和Axalo一样,你可以通过强制转换来解决编译错误。

#include <future>

template<typename T> void non_member_template( T val ) {}

struct X
{
    void member_non_template( int val ) {}
    template<typename T> void member_template( T val ) {}
    void call()
    {
        int val = 123;
        std::async( std::launch::async,  &non_member_template<int>, val ); // ok
        std::async( std::launch::async, &X::member_non_template, this, val ); // ok
        //std::async( std::launch::async, &X::member_template<int>, this, val ); // error
        std::async( std::launch::async, static_cast< void ( X::* )( int )>( &X::member_template<int> ), this, val ); // ok
    }
};

int main()
{
    X x;
    x.call();
}

答案 1 :(得分:0)

显然,这是Microsoft Visual C ++ 2013和2015 Preview中的一个错误,将在Visual C ++的未来版本中修复:Passing member template function to std::async produces compilation error

因此示例程序是有效的C ++代码,如果您需要Visual C ++ 2013的解决方法,请在评论中建议的最后一次调用std::async中使用强制转换:

static_cast<void(X::*)(int)>(&X::member_template<int>)