2011-10-07 92 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);' –