让我们说,我想要这件事:
std::thread(std::sin,2.9);
但是我得到了未解决的函数类型错误。我该如何解决?
std::sin
重载,而不是template
(为什么??)
答案 0 :(得分:4)
根据您包含的标题,有以下内容:
template<class T> complex<T> sin (const complex<T>&); // <complex>
template<class T> valarray<T> sin (const valarray<T>&); // <valarray>
float sin(float); // <cmath>
long double sin(long double); // <cmath>
正如您所看到的,是模板,虽然这在这里并不严格相关。
您只需要告知编译器您想要的[潜在]过载(可能只是后两者):
std::thread((float(*)(float))&std::sin, 2.9);
答案 1 :(得分:2)
你可以
typedef double (*sind)(double);
std::thread((sind) std::sin,2.9);
答案 2 :(得分:1)
您必须将函数指针强制转换为正确的重载类型:
std::thread((float(*)(float))std::sin, 2.9);
答案 3 :(得分:1)
我更喜欢lambda解决方案。它比任何涉及函数指针的东西都要清晰得多。它也比使用函数指针更快,但这通常不重要。
std::thread( []( double x ) { return std::sin(x); }, 2.9 );