2012-12-09 75 views
1

我想寫is_pure_func_ptr名爲特質檢查,可確定該類型是一個純函數指針,如下所示:如何確定參數是否爲純函數指針?

#include <iostream> 

using namespace std; 

void f1() 
{}; 

int f2(int) 
{}; 

int f3(int, int) 
{}; 

struct Functor 
{ 
    void operator()() 
    {} 
}; 

int main() 
{ 
    cout << is_pure_func_ptr<decltype(f1)>::value << endl; // output true 
    cout << is_pure_func_ptr<decltype(f2)>::value << endl; // output true 
    cout << is_pure_func_ptr<decltype(f3)>::value << endl; // output true 
    cout << is_pure_func_ptr<Functor>::value << endl;  // output false 
    cout << is_pure_func_ptr<char*>::value << endl;  // output false 
} 

我的問題是:如何實現的呢?

+0

功能究竟你的「純」的意思,你可能需要額外的工作?對於純粹的定義,Functor對我來說看起來很純粹。 – Mat

+0

@Mat,我的例子是爲了定義「純函數指針」是什麼。 – xmllmx

+0

事情是,[純粹功能](http://en.wikipedia.org/wiki/Pure_function)是一個很好的術語。所以你的問題有點混亂。也許用「普通/頂層函數,而不是成員函數,lambda或其他可調用對象」代替,如果這就是你的意思? – Mat

回答

4

正如Joachim Pileborg所述,std::is_function將完成這項工作。 如果這不是您的選擇,但您擁有C++ 11支持(意味着您只想知道如何自己實現它或您的標準庫尚未實現),那麼可以這樣做:

template<typename T> 
struct is_pure_func_ptr: public std::false_type {}; 
template<typename Ret, typename... Args> 
struct is_pure_func_ptr<Ret(Args...)>: public std::true_type {};//detecting functions themselves 
template<typename Ret, typename... Args> 
struct is_pure_func_ptr<Ret(*)(Args...)>: public std::true_type {};//detecting function pointers 

This works,但是當涉及到支持不同的調用約定和/或CV-合格的指針

+0

非常感謝。灰熊。您的解決方案簡潔而美觀! – xmllmx

3

如果您有C++ 11標準庫,請嘗試使用std::is_function

+0

OP要求它爲仿函數返回false –

+0

是的。我想分解純函數指針和函子。 – xmllmx

+1

@KarthikT正如在OP的例子中所使用的那樣。 –