2010-10-10 45 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

相关问题