2010-10-10 54 views
1
template<class T> 
struct IsFunc 
{ 
    typedef char one; 
    typedef struct 
    { 
     char dummy_[2]; 
    } two; 

    static one f(...); 

    static two f(T (*)[1]); 
    enum {value = (sizeof(f<T>(0)) == 1)}; 
}; 

如果我嘗試在主運行:檢測,如果類型是一個函數

void functionA(); 
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     int a = 0; 
     cout << IsFunc<functionA>::value;//<=--------HERE 

     return 0; 
    } 

我得到一個錯誤:
錯誤1個錯誤C2923:「IsFunc」:「泛函'不是有效的模板類型
我在做什麼錯?
感謝

回答

3

functionA是一個函數,而不是一個類型,所以它不可能是一個有效的模板參數IsFunc它期望一個類型。

如果您需要一個模板來檢測類型是否爲函數類型,則已經有boost::is_function(它是TR1/C++ 0x的一部分)。

+0

另一方面IsFunc ,是細:) – 2010-10-10 12:17:21

+0

@Armen:那是因爲'空隙()'是一種類型的ID。該標準說:「一個模板參數是一個類型的模板參數應該是一個類型id。」# – 2010-10-10 12:20:00

+0

@Kenny && Armen所以有沒有辦法檢查identyfier是否是一個函數? – 2010-10-10 12:22:15

1

如果您有template<class T> class X;您不希望X<3>工作,並推斷Tint,是嗎?這裏同樣是IsFunc<FunctionA>是無效的,但IsFunc<void()>是好的。 HTH

+0

@阿門是的,你說的沒錯,雖然如果能這樣工作會好起來,爲什麼不呢? – 2010-10-10 12:27:32

+0

@There:如果程序語義是由編譯器從評論中推導出來的,那會不錯,你不覺得嗎? :))))) – 2010-10-10 12:28:44

+0

@阿門好吧,我想我所說的並不是那麼愚蠢和不合邏輯的,是嗎? – 2010-10-10 12:32:03

1

其他人已經說明了原因,但這會對你有幫助嗎?

#include <type_traits> 
#include <typeinfo> 
namespace 
{ 
    template<typename T> 
    bool test_if_function (T const &v) 
    { 
     return std::tr1::is_function<T>::value; 
    } 

    void functionA() 
    { 
    } 
} 

int main() 
{ 
    printf ("%d\r\n", test_if_function (1)); 
    printf ("%d\r\n", test_if_function (functionA)); 

    return 0; 
} 
+0

明顯需要TR1 ... – FuleSnabel 2010-10-10 12:36:33

相關問題