2013-05-06 73 views
9

我傳遞函數指針到一個函數模板:的std :: is_function不承認模板參數的函數

int f(int a) { return a+1; } 

template<typename F> 
void use(F f) { 
    static_assert(std::is_function<F>::value, "Function required"); 
} 

int main() { 
    use(&f); // Plain f does not work either. 
} 

但模板參數F不被認可is_function是一個函數,靜態斷言失敗。編譯器錯誤消息說Fint(*)(int)這是一個指向函數的指針。爲什麼它的行爲如此?在這種情況下,如何識別功能或指針功能?

回答

12

F是指向功能(不管您是否通過f&f)的指針。所以刪除指針:

std::is_function<typename std::remove_pointer<F>::type>::value 

(諷刺的是,std::is_function<std::function<FT>> == false ;-))

+2

我厭惡的隱式轉換:( – 2013-05-06 09:33:47

+5

*「(諷刺的是,'的std :: is_function <性病::功能> ==假';-))「* - 也許對未來的標準來說'std :: is_callable'可能是一個好主意,因爲'std :: is_function'甚至不適用於lambdas,只是簡單的函數(每個可調用的時間是一個函數在現代C++中結束了)。 – 2013-05-06 11:30:06

+0

@ChristianRau'std :: is_function'是主要的分類特徵之一。 'is_callable'或類似的東西完全可以完全不同。 – 2013-05-06 16:08:30