指向过载功能的指针

时间:2011-10-07 09:03:39

标签: c++ pointers compiler-errors overloading c++11

让我们说,我想要这件事:

    std::thread(std::sin,2.9);

但是我得到了未解决的函数类型错误。我该如何解决? std::sin重载,而不是template(为什么??)

4 个答案:

答案 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 );