2013-05-06 4 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. 
} 

लेकिन टेम्पलेट तर्क Fis_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

मैं अंतर्निहित रूपांतरण :( –

+5

* घृणा "(विडंबना यह है कि' std :: is_function > == झूठी: तो सूचक को दूर ';-))" * - शायद भविष्य के मानकों के लिए एक 'std :: is_callable' एक अच्छा विचार हो सकता है, क्योंकि' std :: is_function' lambdas के लिए भी काम नहीं करता है, केवल साधारण कार्य (और प्रत्येक कॉल करने योग्य समय था आधुनिक सी ++ में एक समारोह खत्म हो गया है)। –

+0

@ क्रिस्टियन राउ 'std :: is_function' प्राथमिक वर्गीकरण लक्षणों में से एक है। 'is_callable' या ऐसा कुछ भी पूरी तरह से एक अलग उद्देश्य प्रदान करेगा। –

संबंधित मुद्दे