2011-10-07 91 views
2

比方说,我想这件事:指针重载函数

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

,但我得到悬而未决的功能类型的错误。我该如何解决它? std::sin超载,不template(为什么?)

+0

看到http://stackoverflow.com/questions/1353757/how-do-i-refer-to-stdsinconst-valarraydouble – sehe

回答

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

如果你想避免C-投,适当的C++投是'static_cast' 。 –

+1

@MatthieuM .:我不特别(这里完全是多余的;我该怎么办,意外抛弃了常量?),但是谢谢。 –

+1

我更喜欢C++演员阵容,因为演员阵容更加明显,主观,我知道:) –

2

你可以

typedef double (*sind)(double); 

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

你要投的功能指向右侧过载的类型:

std::thread((float(*)(float))std::sin, 2.9); 
1

我更喜欢lambda解决方案。它读取比包含函数指针的任何东西都要干净得多。它也会比使用函数指针更快,但这通常不重要。

std::thread([](double x) { return std::sin(x); }, 2.9); 
+0

我认为它应该读'return std :: sin(x);' –